home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / clipmarks-3.5.0-fx.xpi / chrome / clipmarks.jar / content / clipmarks.js < prev    next >
Text File  |  2008-06-16  |  86KB  |  2,390 lines

  1. const LOAD_FLAGS_NONE = 0;
  2. const LOAD_FLAGS_IS_REFRESH = 16;
  3. const LOAD_FLAGS_IS_LINK = 32;
  4. const LOAD_FLAGS_BYPASS_HISTORY = 64;
  5. const LOAD_FLAGS_REPLACE_HISTORY = 128;
  6. const LOAD_FLAGS_BYPASS_CACHE = 256;
  7. const LOAD_FLAGS_BYPASS_PROXY = 512;
  8. const LOAD_FLAGS_CHARSET_CHANGE = 1024;
  9. const LOAD_FLAGS_MASK = 65535;
  10.  
  11. const STOP_NETWORK = 1;
  12. const STOP_CONTENT = 2;
  13. const STOP_ALL = 3;
  14.  
  15. const CLIPMARKS_VERSION = '3.5.0';
  16.  
  17. const CLIPMARKS_ENABLE_VIDEO = true;
  18.  
  19. var CLIPMARKS_URL_FIRST_TIME_INSTALL = 'clipmarks.com/installed/firefox/';
  20. var CLIPMARKS_URL_UPGRADE_INSTALL = 'clipmarks.com/upgraded/firefox/';
  21.  
  22. var CLIPMARKS_URL_HOME = 'clipmarks.com/';
  23. var CLIPMARKS_URL_SAVE_CLIP = 'clipmarks.com/clip_mozilla_save.aspx';
  24. var CLIPMARKS_URL_EDIT_CLIP = 'clipmarks.com/edit_clip.aspx';
  25. var CLIPMARKS_URL_PRINT_CLIP = 'clipmarks.com/print_clips_direct.aspx';
  26. var CLIPMARKS_URL_EMAIL_CLIP = 'clipmarks.com/email_clipmark.aspx';
  27. var CLIPMARKS_URL_BLOG_CLIP = 'clipmarks.com/blog_this.aspx';
  28. var CLIPMARKS_URL_PUBLIC_LIBRARY = 'clipmarks.com/public/';
  29. var CLIPMARKS_URL_LATEST_POPS = 'clipmarks.com/sort/latest-pops/';
  30. var CLIPMARKS_URL_MY_LIBRARY = 'clipmarks.com/login.aspx?url=/mine/';
  31. var CLIPMARKS_URL_MY_PROFILE = 'clipmarks.com/profile/edit/';
  32. var CLIPMARKS_URL_MY_WIDGET = 'clipmarks.com/login.aspx?url=/my.clipcast/';
  33. var CLIPMARKS_URL_MY_CLIPPERS = 'clipmarks.com/login.aspx?url=/my.clipcast/clippers/';
  34. var CLIPMARKS_URL_HOT = 'clipmarks.com/popular/';
  35. var CLIPMARKS_URL_CLASSIC = 'clipmarks.com/popular/';
  36. var CLIPMARKS_URL_HOW_TO_CLIP = 'clipmarks.com/how-to-clip/';
  37. var CLIPMARKS_URL_PUBLISHING_LIMIT = 'clipmarks.com/publishing-limit/';
  38. var CLIPMARKS_URL_SETTINGS = 'chrome://clipmarks/content/feed_supported_video.xml';
  39. var CLIPMARKS_URL_UNINSTALL = 'clipmarks.com/uninstall.aspx';
  40. var CLIPMARKS_URL_FACEBOOK = 'http://apps.facebook.com/clipmarks/';
  41. var CLIPMARKS_URL_HELP = 'http://clipmarks.com/faq/';
  42.  
  43. var Clipmarks_Preferences = {
  44.     _pref : null,
  45.     get : function (stringa, predefinito) {
  46.         if (this._pref==null)
  47.             this._pref = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch);
  48.             
  49.         try {
  50.             if (typeof(predefinito) == "boolean") {
  51.                 var scelta = this._pref.getBoolPref(stringa);
  52.             }
  53.             else if (typeof(predefinito) == "string") {
  54.                 var scelta = this._pref.getCharPref(stringa);
  55.             }
  56.             else if (typeof(predefinito) == "number") {
  57.                 var scelta = this._pref.getIntPref(stringa);
  58.             }
  59.             return scelta;
  60.         } catch (e) {
  61.             if (typeof(predefinito) == "boolean") {
  62.                 var scelta = this._pref.setBoolPref(stringa, predefinito);
  63.             }
  64.             else if (typeof(predefinito) == "string") {
  65.                 var scelta = this._pref.setCharPref(stringa, predefinito);
  66.             }
  67.             else {
  68.                 var scelta = this._pref.setIntPref(stringa, predefinito);
  69.             }
  70.             return predefinito;
  71.         }
  72.     },
  73.     set : function(stringa, value) {
  74.         if (this._pref==null) {
  75.             this._pref = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch);
  76.         }
  77.         if (typeof(value) == "boolean") {
  78.             this._pref.setBoolPref(stringa, value);
  79.         }
  80.         else if (typeof(value) == "string") {
  81.             this._pref.setCharPref(stringa, value);
  82.         }
  83.         else if (typeof(value) == "number") {
  84.             this._pref.setIntPref(stringa, value);
  85.         }
  86.     },
  87.     removeBranch: function(pref) {
  88.         try {
  89.             this._pref.deleteBranch(pref);
  90.         } catch(e) {}
  91.     }
  92. }
  93.  
  94. function Clipmarks_GetAppName() {
  95.     var name = "unknown";
  96.     try {
  97.         var app = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo).QueryInterface(Components.interfaces.nsIXULRuntime);
  98.         var id = app.ID;
  99.         switch(id)
  100.         {
  101.             case "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}":
  102.                 name = "firefox";
  103.                 break;
  104.             case "{3550f703-e582-4d05-9a08-453d09bdfdc6}":
  105.                 name = "thunderbird";
  106.                 break;
  107.             case "{86c18b42-e466-45a9-ae7a-9b95ba6f5640}":
  108.                 name = "mozilla";
  109.                 break;
  110.             case "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}":
  111.                 name = "seamonkey";
  112.                 break;
  113.             case "{a463f10c-3994-11da-9945-000d60ca027b}":
  114.                 name = "flock";
  115.                 break;
  116.         }
  117.     } catch(e) {}
  118.  
  119.     return name;
  120. }
  121.  
  122. function Clipmarks_GetAppVersion() {
  123.     var ver = null;
  124.     try {
  125.         var app = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo).QueryInterface(Components.interfaces.nsIXULRuntime);
  126.         ver = app.version;
  127.     } catch(e) {}
  128.     return ver;
  129. }
  130.  
  131. function Clipmarks_UninstallObserver() {
  132.     this._observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  133.     this._observerService.addObserver(this, "em-action-requested", false);
  134.     this._guid = '{e1170235-2845-420c-acc3-42261a29dd46}';
  135.  
  136.     var appName = Clipmarks_GetAppName();
  137.     if (!appName || (appName == 'unknown')) {
  138.            appName = '-';
  139.     }
  140.  
  141.     var appVersion = Clipmarks_GetAppVersion();
  142.     if (!appVersion) {
  143.         appVersion = "-";
  144.     }
  145.  
  146.     this._uninstallURL = CLIPMARKS_URL_UNINSTALL;
  147.     this._uninstallURL += '?version=' + CLIPMARKS_VERSION;
  148.     this._uninstallURL += '&app=' + appName;
  149.     this._uninstallURL += '&app-version=' + appVersion;
  150.  
  151.     Clipmarks_Preferences.set('extensions.clipmarks.uninstall_screen_shown', false);
  152. }
  153.  
  154. Clipmarks_UninstallObserver.prototype = {
  155.     observe: function(subject, topic, data) {
  156.         if ((topic == "em-action-requested") && (data == "item-uninstalled")) {
  157.  
  158.             var bUninstallScreenShown = Clipmarks_Preferences.get('extensions.clipmarks.uninstall_screen_shown', false);
  159.             if (bUninstallScreenShown) return;
  160.             Clipmarks_Preferences.set('extensions.clipmarks.uninstall_screen_shown', true);
  161.  
  162.             var updateItem = subject.QueryInterface(Components.interfaces.nsIUpdateItem);
  163.             if (updateItem.id == this._guid) {
  164.                 Clipmarks_set_location(this._uninstallURL, null, true);
  165.             } 
  166.         }
  167.     },
  168.  
  169.     removeObserver : function() {
  170.         this._observerService.removeObserver(this, "em-action-requested");
  171.     }
  172. };
  173.  
  174. var aryEmbed = new Array();
  175.  
  176. var Clipmarks_ClipXML = null;
  177. var Clipmarks_SettingsXML = null;
  178. var Clipmarks_ClipMode = 0;
  179. var Clipmarks_BaseElement = null;
  180. var Clipmarks_ActiveElement = null;
  181. var Clipmarks_ClipElements = new Array();
  182. var Clipmarks_ClipOverlays = new Array();
  183. var Clipmarks_Initialized = false;
  184. var Clipmarks_ContextMenuVisible = false;
  185. var Clipmarks_ElementIsColumn = false;
  186. var Clipmarks_IsContentSelected = false;
  187. var Clipmarks_XMLHTTP = null;
  188. var Clipmarks_IsMac = (navigator.userAgent.toLowerCase().indexOf("mac")!=-1);
  189. var Clipmarks_CancelClick = false;
  190. var Clipmarks_PrintClicked = false;
  191. var Clipmarks_EmailClicked = false;
  192. var Clipmarks_BlogClicked = false;
  193. var Clipmarks_UseBorders = true;
  194.  
  195. var Clipmarks_PageLeft = 0;
  196. var Clipmarks_PageTop = 0;
  197.  
  198. var Clipmarks_CancelMouseUp = false;
  199.  
  200. var Clipmarks_ClipElementIndex = 0;
  201.  
  202. var Clipmarks_BorderLeftId = 'Clipmarks1' + (Math.round((Math.random()*1000))) + 'BorderDiv' + (Math.round((Math.random()*10000)));
  203. var Clipmarks_BorderRightId = 'Clipmarks2' + (Math.round((Math.random()*1000))) + 'BorderDiv' + (Math.round((Math.random()*10000)));
  204. var Clipmarks_BorderTopId = 'Clipmarks3' + (Math.round((Math.random()*1000))) + 'BorderDiv' + (Math.round((Math.random()*10000)));
  205. var Clipmarks_BorderBottomId = 'Clipmarks4' + (Math.round((Math.random()*1000))) + 'BorderDiv' + (Math.round((Math.random()*10000)));
  206.  
  207. var Clipmarks_iFrameCount = 0;
  208.  
  209. var Clipmarks_CharCount = 0;
  210.  
  211. var gClipmarks_UninstallObserver = null;
  212. var gClipmarks_EndDocumentLoadObserver = null;
  213.  
  214. var Clipmarks_SiblingsChecked = 0;
  215.  
  216. function Clipmarks_getNavigationBar(toolbox) {
  217.     var navBar = null;
  218.     for (var i = 0; i < toolbox.childNodes.length; i++ ) {
  219.         var toolbar = toolbox.childNodes[i];
  220.         
  221.         if (toolbar.localName == "toolbar" &&
  222.             toolbar.id == "nav-bar" &&
  223.             toolbar.getAttribute("customizable")=="true" ) {
  224.             navBar = toolbar;
  225.             break;
  226.         }
  227.     }
  228.     return navBar;
  229. }
  230.  
  231. function Clipmarks_addToToolbar(toolbox, toolbar) {
  232.     var toolbarObjects = Clipmarks_SplitX(toolbar.currentSet, ',' );
  233.     var length = toolbarObjects.length;
  234.     Clipmarks_checkAddButton('Clipmarks-Toolbar', 'search-container', toolbarObjects, ( length > 0 ) );
  235.     if ( length != toolbarObjects.length ) {
  236.         var newBarSet = Clipmarks_XasString(toolbarObjects, ',');
  237.         toolbar.currentSet = newBarSet;
  238.         toolbar.setAttribute('currentset', toolbar.currentSet);
  239.         toolbox.ownerDocument.persist(toolbar.id, 'currentset');
  240.         try {
  241.             BrowserToolboxCustomizeDone(true);
  242.         } catch ( e ) {}
  243.     }
  244. }
  245.  
  246. function Clipmarks_XasString( arr, sep ) {
  247.     var str = '';
  248.     for ( var i = 0; i < arr.length; i++ ) {
  249.         if ( i > 0 ) {
  250.             str = str + sep;
  251.         }
  252.         str = str + arr[ i ];
  253.     }
  254.     return str;
  255. }
  256.  
  257.  
  258. function Clipmarks_SplitX(str, separators, returnSeparators ) {
  259.     var tokens = [];
  260.     var buffer = "";
  261.     for ( var i = 0; i < str.length; i++ ) {
  262.         var ch = str.charAt( i );
  263.         if ( separators.indexOf( ch ) != -1 ) {
  264.             if ( buffer != "" ) {
  265.                 tokens[ tokens.length ] = buffer;
  266.             }
  267.             if ( returnSeparators ) {
  268.                 tokens[ tokens.length ] = ch;
  269.             }
  270.             buffer = "";
  271.         } else {
  272.             buffer = buffer + ch;
  273.         }
  274.     }
  275.     if ( buffer != "" ) {
  276.         tokens[ tokens.length ] = buffer;
  277.     }
  278.     return tokens;
  279. }
  280.  
  281. function Clipmarks_checkAddButton(btn, pivot, toolbarObjects, doInsert ) {
  282.     if ( !doInsert ) {
  283.         toolbarObjects.push( btn );
  284.     } else {
  285.         if ( toolbarObjects.indexOf( btn ) == -1 ) {
  286.             var pivotIndex = toolbarObjects.indexOf( pivot );
  287.             if ( pivotIndex == -1 ) {
  288.                 pivotIndex = 0;
  289.                 while ( pivotIndex < toolbarObjects.length) {
  290.                     pivotIndex++;
  291.                 }
  292.             }
  293.             toolbarObjects.splice( pivotIndex, 0, btn );
  294.         }
  295.     }
  296. }
  297.  
  298. function Clipmarks_set_location(uri, postdata, new_tab) {
  299.     var browser = getBrowser();
  300.     if (new_tab) {
  301.         var tab = browser.addTab(uri, Clipmarks_get_nsiuri(browser.contentDocument.referrer), null, (postdata == null) ? null : Clipmarks_get_mime_input_stream(postdata, "application/x-www-form-urlencoded"));
  302.         browser.selectedTab = tab;
  303.     } else {
  304.         browser.webNavigation.loadURI(uri, Components.interfaces.nsIWebNavigation.LOAD_FLAGS_NONE, Clipmarks_get_nsiuri(browser.contentDocument.referrer), (postdata == null) ? null : Clipmarks_get_mime_input_stream(postdata, "application/x-www-form-urlencoded"), null);
  305.     }
  306. }
  307.  
  308. function Clipmarks_get_mime_input_stream(str, content_type) {
  309.     var data_stream = Components.classes["@mozilla.org/io/string-input-stream;1"].createInstance(Components.interfaces.nsIStringInputStream);
  310.     data_stream.setData(str, str.length);
  311.     var mime_stream = Components.classes["@mozilla.org/network/mime-input-stream;1"].createInstance(Components.interfaces.nsIMIMEInputStream);
  312.     mime_stream.addHeader("Content-Type", content_type);
  313.     mime_stream.addContentLength = true;
  314.     mime_stream.setData(data_stream);
  315.     return mime_stream.QueryInterface(Components.interfaces.nsIInputStream);
  316. }
  317.  
  318. function Clipmarks_get_nsiuri(uri_str) {
  319.     var URI = Components.Constructor("@mozilla.org/network/standard-url;1", "nsIURI");
  320.     var uri = new URI;
  321.     uri.spec = uri_str;
  322.     return uri;
  323. }
  324.  
  325. var lBorderKey = 66;
  326. var lClipKey = 67;
  327.  
  328. addEventListener("unload", Clipmarks_UnInit, false);
  329.  
  330. window.addEventListener(
  331.   "load",
  332.   function () {
  333.     gBrowser.addEventListener("pageshow", Clipmarks_Init, true);
  334.   },
  335.   false
  336. );
  337.  
  338. function Clipmarks_KeyPress(event) {
  339.     if (event.ctrlKey && event.shiftKey && event.charCode == 66) {
  340.         Clipmarks_EnableOrangeLines();
  341.     } else if (event.ctrlKey && event.shiftKey && event.charCode == 67) {
  342.         Clipmarks_Clip(event);
  343.     }
  344. }
  345.  
  346. function Clipmarks_EnableOrangeLines(bForceOff) {
  347.     if (bForceOff || Clipmarks_Preferences.get('extensions.clipmarks.use-borders', 1) == 1) {
  348.         Clipmarks_Preferences.set('extensions.clipmarks.use-borders', 0);
  349.         Clipmarks_UseBorders = false;
  350.         window.document.getElementById('Clipmarks_OrangeLinesCheckbox').src = 'chrome://clipmarks/skin/lines-unchecked.gif';
  351.     } else {
  352.         Clipmarks_Preferences.set('extensions.clipmarks.use-borders', 1);
  353.         Clipmarks_UseBorders = true;
  354.         window.document.getElementById('Clipmarks_OrangeLinesCheckbox').src = 'chrome://clipmarks/skin/lines-checked.gif';
  355.     }
  356. }
  357.  
  358.  
  359. function Clipmarks_GetSettings() {
  360.     Clipmarks_XMLHTTP = new XMLHttpRequest();
  361.  
  362.     Clipmarks_XMLHTTP.open('GET', CLIPMARKS_URL_SETTINGS, true);
  363.     Clipmarks_XMLHTTP.onreadystatechange = Clipmarks_SettingsStateChange;
  364.     Clipmarks_XMLHTTP.send(null);
  365.  
  366. }
  367.  
  368. function Clipmarks_SettingsStateChange() {
  369.     if (Clipmarks_XMLHTTP.readyState != 4) {
  370.         return;
  371.     }
  372.     if (!Clipmarks_XMLHTTP.responseXML) {
  373.         return;
  374.     }
  375.     Clipmarks_SettingsXML = Clipmarks_XMLHTTP.responseXML;
  376. }
  377.  
  378. function Clipmarks_Init(event) {
  379.     var oDocument = (!event.target.ownerDocument ? event.target : event.target.ownerDocument);
  380.     if (Clipmarks_Initialized) {
  381.         if (Clipmarks_ClipMode == 1) {
  382.             Clipmarks_iFrameCount = 0;
  383.             //Clipmarks_ShowModeStatus(oDocument);
  384.             Clipmarks_FixPage(oDocument);
  385.             //Clipmarks_HideModeStatus(oDocument);
  386.         }
  387.  
  388.         return;
  389.     } else {
  390.         var bFirstUse = false;
  391.         var sSitePrefix = Clipmarks_Preferences.get('extensions.clipmarks.site-prefix', '');
  392.         
  393.         document.getElementById('appcontent').insertBefore(document.getElementById('Clipmarks-SaveBar'), document.getElementById('content'));
  394.         
  395.         if (sSitePrefix != '') {
  396.             sSitePrefix += '.';
  397.         }
  398.  
  399.         CLIPMARKS_URL_FIRST_TIME_INSTALL = 'http://' + sSitePrefix + CLIPMARKS_URL_FIRST_TIME_INSTALL;
  400.         CLIPMARKS_URL_UPGRADE_INSTALL = 'http://' + sSitePrefix + CLIPMARKS_URL_UPGRADE_INSTALL;
  401.  
  402.         CLIPMARKS_URL_LATEST_POPS = 'http://clipcast.' + sSitePrefix + CLIPMARKS_URL_LATEST_POPS;
  403.  
  404.         CLIPMARKS_URL_SAVE_CLIP = 'http://' + sSitePrefix + CLIPMARKS_URL_SAVE_CLIP;
  405.         CLIPMARKS_URL_EDIT_CLIP = 'http://' + sSitePrefix + CLIPMARKS_URL_EDIT_CLIP;
  406.         CLIPMARKS_URL_PRINT_CLIP = 'http://' + sSitePrefix + CLIPMARKS_URL_PRINT_CLIP;
  407.         CLIPMARKS_URL_EMAIL_CLIP = 'http://' + sSitePrefix + CLIPMARKS_URL_EMAIL_CLIP;
  408.         CLIPMARKS_URL_BLOG_CLIP = 'http://' + sSitePrefix + CLIPMARKS_URL_BLOG_CLIP;
  409.         CLIPMARKS_URL_HOME = 'http://' + sSitePrefix + CLIPMARKS_URL_HOME;
  410.         CLIPMARKS_URL_PUBLIC_LIBRARY = 'http://' + sSitePrefix + CLIPMARKS_URL_PUBLIC_LIBRARY;
  411.         CLIPMARKS_URL_MY_LIBRARY = 'http://' + sSitePrefix + CLIPMARKS_URL_MY_LIBRARY;
  412.         CLIPMARKS_URL_MY_WIDGET = 'http://' + sSitePrefix + CLIPMARKS_URL_MY_WIDGET;
  413.         CLIPMARKS_URL_MY_PROFILE = 'http://' + sSitePrefix + CLIPMARKS_URL_MY_PROFILE;
  414.         CLIPMARKS_URL_MY_CLIPPERS = 'http://' + sSitePrefix + CLIPMARKS_URL_MY_CLIPPERS;
  415.         CLIPMARKS_URL_HOT = 'http://clipcast.' + sSitePrefix + CLIPMARKS_URL_HOT;
  416.         CLIPMARKS_URL_CLASSIC = 'http://' + sSitePrefix + CLIPMARKS_URL_CLASSIC;
  417.         CLIPMARKS_URL_HOW_TO_CLIP = 'http://' + sSitePrefix + CLIPMARKS_URL_HOW_TO_CLIP;
  418.         CLIPMARKS_URL_PUBLISHING_LIMIT = 'http://' + sSitePrefix + CLIPMARKS_URL_PUBLISHING_LIMIT;
  419.         CLIPMARKS_URL_UNINSTALL = 'http://' + sSitePrefix + CLIPMARKS_URL_UNINSTALL;
  420.         
  421.         Clipmarks_SettingsXML = document.implementation.createDocument('','elements',null);
  422.         
  423.         Clipmarks_GetSettings();
  424.  
  425.         if(Clipmarks_Preferences.get('extensions.clipmarks.firstuse', '1') == '1') {
  426.             bFirstUse = true;
  427.             
  428.             var toolbox = window.document.getElementById('navigator-toolbox');
  429.             
  430.             if (toolbox != null) {
  431.                 var navBar = Clipmarks_getNavigationBar( toolbox );
  432.                 if (navBar.getAttribute("collapsed") != "true") {
  433.                     Clipmarks_addToToolbar( toolbox, navBar );
  434.                 }
  435.             }
  436.             setTimeout('Clipmarks_set_location(\'' + CLIPMARKS_URL_FIRST_TIME_INSTALL + '\', null, true)', 500);
  437.             Clipmarks_Preferences.set('extensions.clipmarks.firstuse', '0');
  438.         }
  439.         
  440.         if(Clipmarks_Preferences.get('extensions.clipmarks.firstuse-2.0', 1) == 1) {
  441.             Clipmarks_Preferences.set('extensions.clipmarks.firstuse-2.0', 0);
  442.             Clipmarks_Preferences.set('extensions.clipmarks.use-shortcut-keys', 1);
  443.             
  444.             lClipKey = Clipmarks_Preferences.get('extensions.clipmarks.shortcut-key-clip', lClipKey);
  445.             lBorderKey = Clipmarks_Preferences.get('extensions.clipmarks.shortcut-key-borders', lBorderKey);
  446.             
  447.             Clipmarks_Preferences.set('extensions.clipmarks.shortcut-key-clip', lClipKey);
  448.             Clipmarks_Preferences.set('extensions.clipmarks.shortcut-key-borders', lBorderKey);
  449.             
  450.             if (!bFirstUse) {
  451.                 setTimeout('Clipmarks_set_location(\'' + CLIPMARKS_URL_UPGRADE_INSTALL + '\', null, true)', 500);
  452.             }
  453.         }
  454.         
  455.         if(Clipmarks_Preferences.get('extensions.clipmarks.use-shortcut-keys', 1) == 1) {
  456.             addEventListener("keypress", Clipmarks_KeyPress, true);
  457.         }
  458.         
  459.         if (Clipmarks_Preferences.get('extensions.clipmarks.use-borders', 1) == 0) {
  460.             Clipmarks_EnableOrangeLines(true);
  461.         }
  462.  
  463.         gClipmarks_UninstallObserver = new Clipmarks_UninstallObserver();
  464.         //gClipmarks_EndDocumentLoadObserver = new Clipmarks_EndDocumentLoadObserver();
  465.  
  466.         Clipmarks_Initialized = true;
  467.     }
  468. }
  469.  
  470. function Clipmarks_UnInit(event) {
  471.     if (!!gClipmarks_UninstallObserver) {
  472.         gClipmarks_UninstallObserver.removeObserver();
  473.     }
  474.     if (!!gClipmarks_EndDocumentLoadObserver) {
  475.         gClipmarks_EndDocumentLoadObserver.removeObserver();
  476.     }
  477. }
  478.  
  479. function Clipmarks_Help() {
  480.     var oDocument = getBrowser().contentWindow.document;
  481.     var oEmbeds = oDocument.getElementsByTagName('EMBED');
  482.     for (i = 0; i < oEmbeds.length; i++) {
  483.         oEmbeds[i].style.visibility = 'hidden';
  484.     }
  485.     var oShadow = oDocument.createElement('DIV');
  486.     oShadow.id = 'Clipmarks_ClipModeShadow';
  487.     oShadow.style.position = 'absolute';
  488.     oShadow.style.top = '0px';
  489.     oShadow.style.left = '0px';
  490.     oShadow.style.zIndex = '99998';
  491.     oShadow.style.backgroundColor = '#000000';
  492.     oShadow.style.display = 'block';
  493.     oShadow.style.height = '100%';
  494.     oShadow.style.width = '100%';
  495.     oShadow.style.opacity = '.40';
  496.     oDocument.body.appendChild(oShadow);
  497.     
  498.     var oFrame = oDocument.createElement('IFRAME');
  499.     oFrame.id = 'Clipmarks_ClipModeFrame';
  500.     oFrame.src = 'http://content.clipmarks.com/clip_mode_ex.htm?1';
  501.     oFrame.style.position = 'absolute';
  502.     oFrame.style.top = '25px';
  503.     oFrame.style.left = ((oDocument.body.clientWidth / 2) - 340) + 'px';
  504.     oFrame.style.width = '670px';
  505.     oFrame.style.height = '460px';
  506.     oFrame.style.zIndex = '99999';
  507.     oFrame.style.border = 'solid 8px #EE9800';
  508.     oFrame.style.backgroundColor = '#FFFFFF';
  509.     
  510.     oDocument.body.appendChild(oFrame);
  511.     
  512.     oDocument.defaultView.scrollTo(0,0);
  513. }
  514.  
  515. function Clipmarks_OffsetLeft(oElement) {
  516.     var oParent = oElement;
  517.     var lOffsetLeft = 0;
  518.     while (oParent && oParent.tagName != 'BODY') {
  519.         lOffsetLeft += oParent.offsetLeft;
  520.         oParent = oParent.offsetParent;
  521.     }
  522.     return lOffsetLeft;
  523. }
  524.  
  525. function Clipmarks_OffsetTop(oElement) {
  526.     var oParent = oElement;
  527.     var lOffsetTop = 0;
  528.     while (oParent && oParent.tagName != 'BODY') {
  529.         lOffsetTop += oParent.offsetTop;
  530.         oParent = oParent.offsetParent;
  531.     }
  532.     return lOffsetTop;
  533. }
  534.  
  535. function Clipmarks_PageMouseDown(event) {
  536.     if (event.target.tagName == 'IMG') {
  537.         Clipmarks_CancelMouseUp = true;
  538.     }
  539.     Clipmarks_PageLeft = event.pageX;
  540.     Clipmarks_PageTop = event.pageY;
  541. }
  542.  
  543. function Clipmarks_PageMouseUp(event) {
  544.     if (Clipmarks_ClipMode == 0 || event.target.id.indexOf('Clipmarks_') == 0 || Clipmarks_CancelMouseUp || event.target.tagName == 'HTML') {
  545.         Clipmarks_CancelClick = false;
  546.         Clipmarks_CancelMouseUp = false;
  547.         return;
  548.     }
  549.  
  550.     Clipmarks_RemoveSelectionClipper(event.target.ownerDocument);
  551.     Clipmarks_CheckForSelection(event);
  552.     if (!Clipmarks_IsContentSelected) {
  553.         return;
  554.     }
  555.     
  556.     var oDocument = event.target.ownerDocument;
  557.     var dvOverlay = oDocument.createElement('IMG');
  558.  
  559.     if (Clipmarks_PageTop > event.pageY) {
  560.         Clipmarks_PageTop = event.pageY;
  561.     }        
  562.     
  563.     if (Clipmarks_PageLeft > event.pageX) {
  564.         Clipmarks_PageLeft = event.pageX;
  565.     }        
  566.     
  567.     dvOverlay.setAttribute('id', 'Clipmarks_SelectionClipper');
  568.     dvOverlay.style.position = 'absolute';
  569.     dvOverlay.style.zIndex = '99999';
  570.     
  571.     dvOverlay.src = 'http://content0.clipmarks.com/images/disparate-clip.gif?1';
  572.     dvOverlay.style.top = (Clipmarks_PageTop - 28) + 'px';
  573.     dvOverlay.style.left = (Clipmarks_PageLeft) + 'px';
  574.  
  575.     oDocument.body.appendChild(dvOverlay);
  576.     dvOverlay.addEventListener('click', Clipmarks_ClipSelection, true);
  577. }
  578.  
  579. function Clipmarks_CheckForSelection(e) {
  580.     var oSelection = null;
  581.     
  582.     var oWindow = getBrowser().contentWindow;
  583.     var bFoundSelection = false;
  584.     var oDiv = null;
  585.     var sHTML = '';
  586.     
  587.     bFoundSelection = false;
  588.     oSelection = oWindow.getSelection();
  589.     sHTML = oSelection.toString();
  590.     
  591.     if (sHTML.length > 0) {
  592.         sHTML = sHTML.replace(/<style.*?>.*?<\/style>/g, ' ');
  593.         sHTML = sHTML.replace(/<[^>]+>/g, ' ');
  594.         sHTML = sHTML.replace(/\s+/g, ' ');
  595.  
  596.         if (sHTML.length > 2) {
  597.             bFoundSelection = true;
  598.         } else {
  599.             for (i = 0; i < oWindow.frames.length; i++) {
  600.                 oSelection = oWindow.frames[i].getSelection();
  601.                 sHTML = oSelection.toString();
  602.                 sHTML = sHTML.replace(/<style.*?>.*?<\/style>/g, ' ');
  603.                 sHTML = sHTML.replace(/<[^>]+>/g, ' ');
  604.                 sHTML = sHTML.replace(/\s+/g, ' ');
  605.  
  606.                 if (sHTML.length > 2) {
  607.                     bFoundSelection = true;
  608.                 }
  609.             }
  610.         }
  611.     }
  612.     
  613.     Clipmarks_IsContentSelected = Clipmarks_CancelClick = bFoundSelection;
  614. }
  615.  
  616. function Clipmarks_ContainsElement(container, containee) { 
  617.     var contains = false; 
  618.     while (containee) { 
  619.         if ((contains = container == containee)) {
  620.             break;
  621.         }
  622.         containee = containee.parentNode; 
  623.     } 
  624.     return contains; 
  625.  
  626. function Clipmarks_ShowDoneClipping() {
  627.     if (!Clipmarks_ClipXML || Clipmarks_ClipXML.documentElement.childNodes.length <= 1) {
  628.         window.openDialog('chrome://clipmarks/content/please-clip.xul', 'Clipmarks_PleaseClipSomething', 'chrome,centerscreen,dialog,modal');
  629.         return;
  630.     }
  631.  
  632.     document.getElementById('imgDoneClipping1').hidden = true;
  633.     document.getElementById('imgDoneClipping2').hidden = false;
  634.  
  635.     setTimeout('Clipmarks_ShowDoneClippingStep2()', 50);
  636.     Clipmarks_ContextMenuVisible = true;
  637.     return true;
  638. }
  639.  
  640. function Clipmarks_ShowDoneClippingStep2() {
  641.     var oContextMenu = document.getElementById('Clipmarks-MenuDoneClipping');
  642.  
  643.     oContextMenu.showPopup(document.getElementById('imgDoneClipping2'), -1, -1, 'popup', 'bottomleft', 'topleft');
  644. }
  645.  
  646. function Clipmarks_HideDoneClipping() {
  647.     document.getElementById('imgDoneClipping2').hidden = true;
  648.     document.getElementById('imgDoneClipping1').hidden = false;
  649.     Clipmarks_ContextMenuVisible = false;
  650.     
  651.     return true;
  652. }
  653.  
  654. function Clipmarks_GetAttribute(oElement, sAttribute, sDefault) {
  655.     var sReturn = sDefault;
  656.     if (oElement.getAttribute(sAttribute)) {
  657.         sReturn = oElement.getAttribute(sAttribute);
  658.     }
  659.     return sReturn;
  660. }
  661.  
  662. function Clipmarks_GetOuterHTML(oElement, bRoot) {
  663.     var _emptyTags = {
  664.     'img':   true,
  665.     'br':    true,
  666.     'input': true,
  667.     'meta':  true,
  668.     'link':  true,
  669.     'param': true,
  670.     'hr':    true};
  671.     
  672.     var attrs = oElement.attributes;
  673.     var str = '<' + oElement.tagName;
  674.     var i = 0;
  675.     var sTagName = oElement.tagName.toLowerCase();
  676.     var sSRC = '';
  677.     
  678.     if (sTagName == 'iframe' || sTagName == 'script' || Clipmarks_GetAttribute(oElement, 'name', '').indexOf('Clipmarks_') >= 0) {
  679.         return '';
  680.     }
  681.     if (sTagName == 'form' && Clipmarks_GetAttribute(oElement, 'class', '') == 'yqin' && Clipmarks_GetAttribute(oElement, 'action', '') == 'http://yq.search.yahoo.com/search') {
  682.         return '';
  683.     }
  684.     
  685.     for (var i = 0; i < attrs.length; i++) {
  686.         if (attrs[i].name != 'style' && attrs[i].name.indexOf('on') != 0) {
  687.             if (sTagName == 'embed') {
  688.                 if (attrs[i].name == 'src') {
  689.                     if (window.content.location.hostname.indexOf('youtube.com') >= 0) {
  690.                         str += ' src="' + attrs[i].value.replace(/\/player(2)?\.swf\?video_id\=([^\&]+)(\&.*)?/m, 'http://www.youtube.com/v/$2') + '"';
  691.                     } else {
  692.                         str += ' src="' + attrs[i].value.replace(/http\:\/\/(www\.)?youtube\.com\/player(2)?\.swf\?video_id\=([^\&]+)(\&.*)?/m, 'http://www.youtube.com/v/$3') + '"';
  693.                     }
  694.                 } else if (attrs[i].name == 'type' || attrs[i].name == 'pluginspage') {
  695.                     str += ' ' + attrs[i].name + '="' + attrs[i].value + '"';
  696.                 }
  697.             } else {
  698.                 str += ' ' + attrs[i].name + '="' + attrs[i].value + '"';
  699.             }
  700.         }
  701.     }
  702.     if (sTagName == 'embed') {
  703.         str += ' width="95%" height="87%" wmode="transparent" scale="showall" ALIGN="middle"';
  704.     }
  705.     
  706.     if (_emptyTags[sTagName]) {
  707.         return str + ' />';
  708.     }
  709.  
  710.     str += '>';
  711.     
  712.     str += Clipmarks_GetInnerHTML(oElement);
  713.     
  714.     str += '</' + oElement.tagName + '>';
  715.     
  716.     return str;
  717.  
  718. }
  719.  
  720. function Clipmarks_GetInnerHTML(oElement) {
  721.     var str = '';
  722.     var i = 0;
  723.  
  724.     for (i = 0; i < oElement.childNodes.length; i++) {
  725.         if (oElement.childNodes[i].nodeType == 1) {
  726.             str += Clipmarks_GetOuterHTML(oElement.childNodes[i], false);
  727.         } else if (oElement.childNodes[i].nodeType == 3) {
  728.             str += oElement.childNodes[i].nodeValue.replace(/\</g, '<').replace(/\>/g, '>');
  729.         }
  730.     }
  731.  
  732.     return str;
  733.  
  734. }
  735.  
  736. function Clipmarks_Clip(event) {
  737.     if (Clipmarks_ClipMode == 0) {
  738.         Clipmarks_SetClipMode(1);
  739.     } else {
  740.         Clipmarks_SetClipMode(0);
  741.     }
  742. }
  743.  
  744. function Clipmarks_IsBlockElement(oElement) {
  745.     var itscomputedstyle = document.defaultView.getComputedStyle(oElement,'');
  746.     var bIsBlockElement = false;
  747.     var i = 0;
  748.     
  749.     bIsBlockElement = (oElement.getAttribute('clipmarks-spacer') == 'true');
  750.     bIsBlockElement = (bIsBlockElement || (itscomputedstyle.getPropertyValue('display') == 'block' || itscomputedstyle.getPropertyValue('display') == 'table' || oElement.tagName == 'TBODY' || oElement.tagName == 'TR' || oElement.tagName == 'TH' || oElement.tagName == 'TD' || oElement.tagName == 'BR'));
  751.     
  752.     if (!bIsBlockElement && oElement.tagName != 'SELECT') {
  753.         for (i = 0; i < oElement.childNodes.length; i++) {
  754.             if (oElement.childNodes[i].nodeType == 1 && Clipmarks_IsBlockElement(oElement.childNodes[i])) {
  755.                 return true;
  756.             }
  757.         }
  758.     }
  759.     
  760.     if (bIsBlockElement) {
  761.         bIsBlockElement = (itscomputedstyle.getPropertyValue('float') == 'none');
  762.     }
  763.     
  764.     return bIsBlockElement;
  765. }
  766.  
  767. function Clipmarks_ClipModeOK(event) {
  768.     var oDocument = event.target.ownerDocument;
  769.     var fraClipMode = oDocument.defaultView.frameElement;
  770.     
  771.     if (!!fraClipMode) {
  772.         if (oDocument.getElementById('Clipmarks_chkShowAgain').checked) {
  773.             Clipmarks_Preferences.set('extensions.clipmarks.show-clip-mode-help', 0);
  774.         }
  775.         oDocument = fraClipMode.ownerDocument;
  776.         oDocument.body.removeChild(fraClipMode.previousSibling);
  777.         oDocument.body.removeChild(fraClipMode);
  778.     }
  779.     var oEmbeds = oDocument.getElementsByTagName('EMBED');
  780.     for (i = 0; i < oEmbeds.length; i++) {
  781.         oEmbeds[i].style.visibility = 'visible';
  782.     }
  783.  
  784. }
  785.  
  786. function Clipmarks_FixPage(oDocument) {
  787.     var i = 0;
  788.     
  789.     if (oDocument.defaultView.location.pathname.indexOf('clip_mode_ex.htm') >= 0) {
  790.         var imgOK = oDocument.getElementById('Clipmarks_imgOK');
  791.         if (!!imgOK) {
  792.             imgOK.addEventListener('click', Clipmarks_ClipModeOK, true);
  793.         }
  794.         return;
  795.     }
  796.  
  797.     Clipmarks_iFrameCount++;
  798.     if (Clipmarks_iFrameCount > 30) {
  799.         return;
  800.     }
  801.     for (i = 0; i < oDocument.defaultView.frames.length; i++) {
  802.         Clipmarks_FixPage(oDocument.defaultView.frames[i].document);
  803.     }
  804.  
  805.     if (oDocument.body && !oDocument.body.hasAttribute('clipmarks_processed')) {
  806.         oDocument.normalize();
  807.  
  808.         Clipmarks_FixElement(oDocument.body);
  809.         Clipmarks_AddPageWatch(oDocument);
  810.  
  811.         oDocument.body.setAttribute('clipmarks_processed', 'true');
  812.     }
  813. }
  814.  
  815. function Clipmarks_RemoveMods(oDocument) {
  816.     if (!oDocument) {
  817.         return;
  818.     }
  819.     var i = 0;
  820.     var oNames = null;
  821.  
  822.     oDocument.removeEventListener('mouseover', Clipmarks_ElementMouseOver, true);
  823.     oDocument.removeEventListener('mouseout', Clipmarks_ElementMouseOut, true);
  824.     oDocument.removeEventListener('mouseup', Clipmarks_CheckForSelection, false); 
  825.     
  826.     if (!!oDocument.getElementById('Clipmarks_ClipModeFrame')) {
  827.         var oEmbeds = oDocument.getElementsByTagName('EMBED');
  828.         for (i = 0; i < oEmbeds.length; i++) {
  829.             oEmbeds[i].style.visibility = 'visible';
  830.         }
  831.  
  832.         oDocument.body.removeChild(oDocument.getElementById('Clipmarks_ClipModeFrame').previousSibling);
  833.         oDocument.body.removeChild(oDocument.getElementById('Clipmarks_ClipModeFrame'));
  834.     }
  835.  
  836.     Clipmarks_iFrameCount++;
  837.     if (Clipmarks_iFrameCount > 30) {
  838.         return;
  839.     }
  840.     for (i = 0; i < oDocument.defaultView.frames.length; i++) {
  841.         Clipmarks_RemoveMods(oDocument.defaultView.frames[i].document);
  842.     }
  843.  
  844.     if (oDocument.getElementById(Clipmarks_BorderLeftId)) {
  845.         oDocument.body.removeChild(oDocument.getElementById(Clipmarks_BorderLeftId));
  846.     }
  847.     if (oDocument.getElementById(Clipmarks_BorderRightId)) {
  848.         oDocument.body.removeChild(oDocument.getElementById(Clipmarks_BorderRightId));
  849.     }
  850.     if (oDocument.getElementById(Clipmarks_BorderTopId)) {
  851.         oDocument.body.removeChild(oDocument.getElementById(Clipmarks_BorderTopId));
  852.     }
  853.     if (oDocument.getElementById(Clipmarks_BorderBottomId)) {
  854.         oDocument.body.removeChild(oDocument.getElementById(Clipmarks_BorderBottomId));
  855.     }
  856.     if (!!oDocument.getElementsByName) {
  857.         oNames = oDocument.getElementsByName('Clipmarks_ObjectDiv');
  858.         for (i = 0; i < oNames.length; i++) {
  859.             oDocument.body.removeChild(oNames[i]);
  860.         }
  861.  
  862.         oNames = oDocument.getElementsByName('Clipmarks_ObjectDivHeader');
  863.         for (i = 0; i < oNames.length; i++) {
  864.             oDocument.body.removeChild(oNames[i]);
  865.         }
  866.     }
  867.     
  868.     Clipmarks_RemoveSelectionBounds(oDocument);
  869.     Clipmarks_RemoveSelectionClipper(oDocument);
  870.     
  871.     if (!!oDocument.body) {
  872.         oDocument.body.removeAttribute('clipmarks_processed');
  873.     }
  874. }
  875.  
  876. function Clipmarks_RemoveSelectionBounds(oDocument, lClipElementIndex) {
  877.     if (!oDocument.getElementsByName) {
  878.         return;
  879.     }
  880.     if (!lClipElementIndex) {
  881.         lClipElementIndex = -1;
  882.     }
  883.  
  884.     var oRange = null;
  885.     oNames = oDocument.getElementsByName('Clipmarks_SelectionBounds');
  886.     for (i = oNames.length - 1; i >= 0; i--) {
  887.         if (lClipElementIndex == -1 || oNames[i].getAttribute('clip-index') == lClipElementIndex) {
  888.             if (oNames[i].tagName != 'IMG') {
  889.                 oRange = oDocument.createRange();
  890.                 oRange.selectNodeContents(oNames[i]);
  891.                 oNames[i].parentNode.insertBefore(oRange.extractContents(), oNames[i]);
  892.                 oRange.detach();
  893.             }
  894.             oNames[i].parentNode.removeChild(oNames[i]);
  895.         }
  896.     }
  897.  
  898. }
  899.  
  900. function Clipmarks_Trim(str) {
  901.     var sx = new String();
  902.     sx = str;
  903.     sx = sx.replace(/^\s*/g, '');
  904.     sx = sx.replace(/\s*$/g, '');
  905.  
  906.     return sx;
  907. }
  908.  
  909. function Clipmarks_EmbedClip(event) {
  910.     if (event.target.src == 'http://content0.clipmarks.com/images/video-clipped.gif') {
  911.         Clipmarks_RemoveEmbed(aryEmbed[event.target.getAttribute('elementIndex')], event.target.getAttribute('elementIndex'));
  912.         event.target.src = 'http://content0.clipmarks.com/images/video-clip.gif';
  913.     } else {
  914.         Clipmarks_ClipHTMLEmbed(aryEmbed[event.target.getAttribute('elementIndex')], event.target.getAttribute('elementIndex'));
  915.         event.target.src = 'http://content0.clipmarks.com/images/video-clipped.gif';
  916.     }
  917. }
  918.  
  919. function Clipmarks_RemoveEmbed(oEmbed, lIndex) {
  920.     var j = 0;
  921.     for (j = 1; j < Clipmarks_ClipXML.documentElement.childNodes.length; j++) {
  922.         if (Clipmarks_ClipXML.documentElement.childNodes[j].getAttribute('embed-index') == lIndex && Clipmarks_ClipXML.documentElement.childNodes[j].getAttribute('type') == 'HTMLEmbed') {
  923.             Clipmarks_ClipXML.documentElement.removeChild(Clipmarks_ClipXML.documentElement.childNodes[j]);
  924.             break;
  925.         }
  926.     }    
  927.             
  928. }
  929.  
  930.  
  931.  
  932. function Clipmarks_FixElement(oElement) {
  933.     var oDocument = oElement.ownerDocument;
  934.     if (!oDocument.createElement('DIV')) {
  935.         return;
  936.     }
  937.     var brStart = null;
  938.     var brEnd = null;
  939.     var oNode = null;
  940.     var oRange = null;
  941.     var i = 0;
  942.     var sDomain = '';
  943.     var sSrc = '';
  944.  
  945.     for (i = 0; i < oElement.childNodes.length; i++) {
  946.         if (oElement.childNodes[i].nodeType == 1) {
  947.             Clipmarks_FixElement(oElement.childNodes[i]);
  948.         }
  949.     }
  950.  
  951.     if (CLIPMARKS_ENABLE_VIDEO && oElement.tagName == 'EMBED') {
  952.         sSrc = oElement.src;
  953.         for (i = 0; i < Clipmarks_SettingsXML.documentElement.childNodes.length; i++) {
  954.             sDomain = Clipmarks_SettingsXML.documentElement.childNodes[i].getAttribute('domain');
  955.             if ((sSrc.indexOf(sDomain) <= 13 && sSrc.indexOf(sDomain) != -1) || oDocument.defaultView.location.hostname.indexOf(sDomain) >= 0) {
  956.                 var dvOverlay = oDocument.createElement('IMG');
  957.                 i = aryEmbed.length + 1;
  958.                 aryEmbed[i] = oElement;
  959.                 dvOverlay.setAttribute('name', 'Clipmarks_ObjectDivHeader');
  960.                 dvOverlay.setAttribute('elementIndex', i);
  961.                 dvOverlay.style.position = 'absolute';
  962.                 dvOverlay.style.zIndex = '99999';
  963.                 dvOverlay.style.cursor = 'pointer';
  964.  
  965.                 dvOverlay.src = 'http://content0.clipmarks.com/images/video-clip.gif';
  966.                 dvOverlay.style.top = (Clipmarks_OffsetTop(oElement) - 19) + 'px';
  967.                 dvOverlay.style.left = (Clipmarks_OffsetLeft(oElement) +(oElement.offsetWidth - 67)) + 'px';
  968.  
  969.                 oDocument.body.appendChild(dvOverlay);
  970.                 if (oDocument.location.hostname.indexOf('youtube.com') >= 0 && oDocument.getElementsByName('embed_code').length > 0 && oDocument.getElementsByName('embed_code')[0].value.indexOf('Embedding disabled') >= 0) {
  971.                     dvOverlay.src = 'http://content0.clipmarks.com/images/video-no-clipping.gif';
  972.                     dvOverlay.addEventListener('click', function(){alert('This video can not be clipped because embedding has been disabled.')}, true);
  973.                 } else {
  974.                     dvOverlay.addEventListener('click', Clipmarks_EmbedClip, true);
  975.                 }
  976.                 break;
  977.             }
  978.         }
  979.  
  980.     }
  981.  
  982.     var oBRs = oElement.getElementsByTagName('BR');
  983.     i = 0;
  984.     while (i < oBRs.length) {
  985.         brStart = oBRs[i];
  986.         if (brStart.parentNode == oElement) {
  987.             oNode = brStart.nextSibling;
  988.             while (oNode && oNode.nodeType != 1) {
  989.                 if (oNode.nodeType == 3 && Clipmarks_Trim(oNode.textContent) != '') {
  990.                     oNode = null;
  991.                     break;
  992.                 }
  993.                 oNode = oNode.nextSibling;
  994.             }
  995.             if (oNode && oNode.tagName == 'BR') {
  996.                 oNode = brStart.previousSibling;
  997.                 while (oNode) {
  998.                     if (oNode.nodeType == 1  && (Clipmarks_IsBlockElement(oNode) || oNode.tagName == 'BR')) {
  999.                         break;
  1000.                     }
  1001.                     oNode = oNode.previousSibling;
  1002.                 }
  1003.                 oRange = oDocument.createRange();
  1004.                 if (oNode) {
  1005.                     oRange.setStartAfter(oNode);
  1006.                 } else {
  1007.                     oRange.setStartBefore(oElement.firstChild);
  1008.                 }
  1009.                 oRange.setEndBefore(brStart);
  1010.                 
  1011.                 if (Clipmarks_Trim(oRange.toString()).length > 5) {
  1012.                     oNode = oDocument.createElement('DIV');
  1013.                     oNode.name = 'Clipmarks_Spacer';
  1014.                     oRange.surroundContents(oNode);
  1015.                     oElement.removeChild(brStart);
  1016.                 }
  1017.             }
  1018.         }
  1019.  
  1020.         i++;
  1021.     }
  1022. }
  1023.  
  1024. function Clipmarks_IsBadTag(sTag) {
  1025.     return (sTag == 'SCRIPT' || sTag == 'STYLE' || sTag == 'NOSCRIPT');
  1026. }
  1027.  
  1028. function Clipmarks_SetClipMode(lMode) {
  1029.     var i = 0;
  1030.     if (lMode == 1) {
  1031.         Clipmarks_ClipElementIndex = 0;
  1032.         
  1033.         Clipmarks_ClipMode = 1;
  1034.         document.getElementById('Clipmarks-TB-Clip').checked = true;
  1035.         document.getElementById('Clipmarks-TB-Clip').tooltipText = 'exit clip mode';
  1036.         
  1037.         Clipmarks_CheckForSelection();
  1038.  
  1039.         for (i = 0; i < window.frames.length; i++) {
  1040.             Clipmarks_ShowModeStatus(window.frames[i].document);
  1041.         }
  1042.         Clipmarks_CalcPopLimit();
  1043.         window.document.getElementById('Clipmarks-SaveBar').hidden = false;
  1044.         setTimeout('Clipmarks_FixAllPages()', 50);
  1045.     } else {
  1046.         setTimeout('window.document.getElementById(\'Clipmarks-SaveBar\').hidden = true', 250);
  1047.         Clipmarks_ClipMode = 0;
  1048.         Clipmarks_ClearOverlays();
  1049.         document.getElementById('Clipmarks-TB-Clip').checked = false;
  1050.         document.getElementById('Clipmarks-TB-Clip').tooltipText = 'enter clip mode';
  1051.  
  1052.         Clipmarks_iFrameCount = 0;
  1053.         for (i = 0; i < window.frames.length; i++) {
  1054.             if (window.frames[i].name != 'Clipmarks_SaveOverlimitDialog') {
  1055.                 Clipmarks_RemoveMods(window.frames[i].document);
  1056.             }
  1057.         }
  1058.     }
  1059. }
  1060.  
  1061. function Clipmarks_FixAllPages() {
  1062.     for (i = 0; i < window.frames.length; i++) {
  1063.         Clipmarks_iFrameCount = 0;
  1064.         Clipmarks_FixPage(window.frames[i].document);
  1065.     }
  1066.     for (i = 0; i < window.frames.length; i++) {
  1067.         Clipmarks_HideModeStatus(window.frames[i].document);
  1068.     }
  1069. }
  1070.  
  1071. function Clipmarks_ShowModeStatus(oDocument) {
  1072. return;
  1073.     HideScrollbars(oDocument);
  1074.  
  1075.     var oImage = oDocument.createElement('IMG');
  1076.     oImage.id = 'imgClipmarksStatusImage';
  1077.     oImage.src = 'chrome://clipmarks/skin/entering-clip-mode.gif';
  1078.     oImage.style.position = 'absolute';
  1079.     oImage.style.top = '0px';
  1080.     oImage.style.left = '0px';
  1081.     oImage.style.zIndex = '9998';
  1082.     oImage.style.opacity = '0.92';
  1083.     oImage.style.Mozopacity = '0.92';
  1084.     
  1085.     oDocument.body.appendChild(oImage);
  1086.     
  1087.     oDocument.body.setAttribute('previous-overflow', oDocument.body.style.overflow);
  1088.     oDocument.body.style.overflow = 'hidden';
  1089. }
  1090.  
  1091. function Clipmarks_HideModeStatus(oDocument) {
  1092. return;
  1093.     ShowScrollbars(oDocument);
  1094.     oDocument.body.removeChild(oDocument.getElementById('imgClipmarksStatusImage'));    
  1095.  
  1096.     oDocument.body.style.overflow = oDocument.body.getAttribute('previous-overflow');
  1097. }
  1098.  
  1099.  
  1100. function HideScrollbars(oDocument) {
  1101.     var is_mac = false;
  1102.     if (is_mac) { 
  1103.     }
  1104. }
  1105.  
  1106.  
  1107. function ShowScrollbars(oDocument) {
  1108.     var is_mac = false;
  1109.     if (is_mac) { 
  1110.     }
  1111. }
  1112.  
  1113.  
  1114. function Clipmarks_Tag(event, bPrint, bEmail, bBlog) {
  1115.     document.getElementById('Clipmarks-MenuDoneClipping').hidePopup();
  1116.     
  1117.     Clipmarks_PrintClicked = (bPrint == true);
  1118.     Clipmarks_EmailClicked = (bEmail == true);
  1119.     Clipmarks_BlogClicked = (bBlog == true);
  1120.  
  1121.     if (!bPrint && !bEmail && Clipmarks_CharCount > 1000) {
  1122.         if (bBlog) {
  1123.             window.openDialog('chrome://clipmarks/content/blog-overlimit.xul', 'Clipmarks_BlogOverlimitDialog', 'chrome,centerscreen,dialog,modal');
  1124.         } else {
  1125.             window.openDialog('chrome://clipmarks/content/save-overlimit.xul', 'Clipmarks_SaveOverlimitDialog', 'chrome,centerscreen,dialog,modal');
  1126.         }
  1127.         return;
  1128.     }
  1129.     Clipmarks_Save();
  1130. }
  1131.  
  1132. function Clipmarks_Save() {
  1133.     
  1134.     Clipmarks_XMLHTTP = new XMLHttpRequest();
  1135.     var oSerializer = new XMLSerializer();
  1136.     var sXML = new XMLSerializer().serializeToString(Clipmarks_ClipXML);
  1137.     
  1138.     Clipmarks_XMLHTTP.open('POST', CLIPMARKS_URL_SAVE_CLIP, true);
  1139.     Clipmarks_XMLHTTP.onreadystatechange = Clipmarks_SaveStateChange;
  1140.     Clipmarks_XMLHTTP.send(sXML);
  1141.  
  1142.     Clipmarks_SetClipMode(0);
  1143.  
  1144. }
  1145.  
  1146. function Clipmarks_SaveStateChange() {
  1147.     if (Clipmarks_XMLHTTP.readyState != 4) {
  1148.         return;
  1149.     }
  1150.  
  1151.     if (Clipmarks_PrintClicked) {
  1152.         window.open(CLIPMARKS_URL_PRINT_CLIP + '?direct=true&c=' + Clipmarks_XMLHTTP.responseXML.documentElement.textContent, 'Clipmarks_PrintClip', 'width=759,height=555,resizable=yes');
  1153.     } else if (Clipmarks_EmailClicked) {
  1154.         window.open(CLIPMARKS_URL_EMAIL_CLIP + '?direct=true&clipmark=' + Clipmarks_XMLHTTP.responseXML.documentElement.textContent, 'Clipmarks_EmailClip', 'width=759,height=555,resizable=yes');
  1155.     } else if (Clipmarks_BlogClicked) {
  1156.         window.open(CLIPMARKS_URL_BLOG_CLIP + '?direct=true&c=' + Clipmarks_XMLHTTP.responseXML.documentElement.textContent, 'Clipmarks_BlogClip', 'width=759,height=555,resizable=yes');
  1157.     } else {
  1158.         window.open(CLIPMARKS_URL_EDIT_CLIP + '?clipping=true&clip_guid=' + Clipmarks_XMLHTTP.responseXML.documentElement.textContent, 'Clipmarks_EditClip', 'width=759,height=555,resizable=yes');
  1159.     }
  1160. }
  1161.  
  1162. function Clipmarks_InitXML() {
  1163.     Clipmarks_ClipXML = document.implementation.createDocument('','elements',null);
  1164.     Clipmarks_ClipXML.documentElement.setAttribute('version', CLIPMARKS_VERSION);
  1165.     var oClient = Clipmarks_ClipXML.createElement('client');
  1166.     oClient.appendChild(Clipmarks_ClipXML.createElement('userAgent')).textContent = window.navigator.userAgent;
  1167.     Clipmarks_ClipXML.documentElement.appendChild(oClient);
  1168. }
  1169.  
  1170. function Clipmarks_AddPageWatch(oDocument) {
  1171.     if (!oDocument.createElement('DIV')) {
  1172.         return;
  1173.     }
  1174.     if (Clipmarks_ClipXML == null) {
  1175.         Clipmarks_InitXML();
  1176.     }
  1177.     
  1178.     if (oDocument.getElementById(Clipmarks_BorderLeftId)) {
  1179.         return;
  1180.     }
  1181.     
  1182.     var oBorderDiv;
  1183.  
  1184.     oBorderDiv = oDocument.createElement('DIV');
  1185.     oBorderDiv.id = Clipmarks_BorderLeftId;
  1186.     oBorderDiv.style.position = 'absolute';
  1187.     oBorderDiv.style.width = '0px';
  1188.     oBorderDiv.style.border = 'orange 2px solid';
  1189.     oBorderDiv.style.display = 'none';
  1190.     oBorderDiv.style.zIndex = '99998';
  1191.     oBorderDiv.style.padding = '0px';
  1192.     oBorderDiv.style.margin = '0px';
  1193.     oDocument.body.appendChild(oBorderDiv);
  1194.  
  1195.     oBorderDiv = oDocument.createElement('DIV');
  1196.     oBorderDiv.id = Clipmarks_BorderRightId;
  1197.     oBorderDiv.style.position = 'absolute';
  1198.     oBorderDiv.style.width = '0px';
  1199.     oBorderDiv.style.border = 'orange 2px solid';
  1200.     oBorderDiv.style.display = 'none';
  1201.     oBorderDiv.style.zIndex = '99998';
  1202.     oBorderDiv.style.padding = '0px';
  1203.     oBorderDiv.style.margin = '0px';
  1204.     oDocument.body.appendChild(oBorderDiv);
  1205.  
  1206.     oBorderDiv = oDocument.createElement('DIV');
  1207.     oBorderDiv.id = Clipmarks_BorderTopId;
  1208.     oBorderDiv.style.position = 'absolute';
  1209.     oBorderDiv.style.height = '0px';
  1210.     oBorderDiv.style.border = 'orange 2px solid';
  1211.     oBorderDiv.style.display = 'none';
  1212.     oBorderDiv.style.zIndex = '99998';
  1213.     oBorderDiv.style.padding = '0px';
  1214.     oBorderDiv.style.margin = '0px';
  1215.     oDocument.body.appendChild(oBorderDiv);
  1216.  
  1217.     oBorderDiv = oDocument.createElement('DIV');
  1218.     oBorderDiv.id = Clipmarks_BorderBottomId;
  1219.     oBorderDiv.style.position = 'absolute';
  1220.     oBorderDiv.style.height = '0px';
  1221.     oBorderDiv.style.border = 'orange 2px solid';
  1222.     oBorderDiv.style.display = 'none';
  1223.     oBorderDiv.style.zIndex = '99998';
  1224.     oBorderDiv.style.padding = '0px';
  1225.     oBorderDiv.style.margin = '0px';
  1226.     oDocument.body.appendChild(oBorderDiv);
  1227.  
  1228.     oDocument.addEventListener('mouseover', Clipmarks_ElementMouseOver, true);
  1229.     oDocument.addEventListener('mouseout', Clipmarks_ElementMouseOut, true);
  1230.  
  1231.     oDocument.addEventListener('mousedown', Clipmarks_PageMouseDown, true);
  1232.     oDocument.addEventListener('mouseup', Clipmarks_PageMouseUp, true);
  1233. }
  1234.  
  1235. function PrintToLog(oDocument, sText) {
  1236. return;
  1237.     var oPrintLog = oDocument.getElementById('dvPrintLog');
  1238.     if (!oPrintLog) {
  1239.         var oLineDiv = null;
  1240.         oLineDiv = oDocument.createElement('DIV');
  1241.         oLineDiv.id = 'dvPrintLog';
  1242.         oLineDiv.style.position = 'absolute';
  1243.         oLineDiv.style.border = 'green 2px solid';
  1244.         oLineDiv.style.backgroundColor = '#FFFFFF';
  1245.         oLineDiv.align = 'left';
  1246.         oLineDiv.style.height = '600px';
  1247.         oLineDiv.style.width = '500px';
  1248.         oLineDiv.style.top = '10px';
  1249.         oLineDiv.style.left = '750px';
  1250.         oLineDiv.style.top = '0px';
  1251.         oLineDiv.style.display = 'block';
  1252.         oLineDiv.style.zIndex = '99998';
  1253.         oLineDiv.style.padding = '0px';
  1254.         oLineDiv.style.margin = '0px';
  1255.         //oLineDiv.style.float = 'right';
  1256.         oLineDiv.style.overflow = 'auto';
  1257.  
  1258.         oDocument.body.appendChild(oLineDiv);
  1259.         oPrintLog = oLineDiv;
  1260.     }
  1261.  
  1262.     oPrintLog.innerHTML = sText + '<br /><br />' + oPrintLog.innerHTML;
  1263. }
  1264.  
  1265. function Clipmarks_CheckForOverlappingRect(oRect, oElement) {
  1266.     var oDocument = oElement.ownerDocument;
  1267.  
  1268.     var oInsideElement = oElement.previousSibling;
  1269.     var oInsideRect = null;
  1270.     var oReturn = null;
  1271.  
  1272.     if (!oInsideElement) {
  1273.         return false;
  1274.     }
  1275.  
  1276.     if (oInsideElement.nodeType != 1) {
  1277.         return Clipmarks_CheckForOverlappingRect(oRect, oInsideElement);
  1278.     }
  1279.     
  1280.     Clipmarks_SiblingsChecked++;
  1281.     if (Clipmarks_SiblingsChecked > 20) {
  1282.         return false;
  1283.     }
  1284.  
  1285.     oInsideRect = Clipmarks_GetRect(oDocument, oInsideElement);
  1286.     if ((oInsideRect.top < oRect.bottom && oInsideRect.bottom > oRect.top) && (oInsideRect.left < oRect.right && oInsideRect.right > oRect.left)) {
  1287.         return oInsideRect;
  1288.     }
  1289.  
  1290.     oReturn = Clipmarks_CheckForOverlappingRect(oRect, oInsideElement);
  1291.     if (oReturn) {
  1292.         return oReturn;
  1293.     }
  1294.  
  1295.     for (i = 0; i < oInsideElement.childNodes.length; i++) {
  1296.         if (oInsideElement.childNodes[i].nodeType == 1) {
  1297.             oInsideRect = Clipmarks_GetRect(oDocument, oInsideElement.childNodes[i]);
  1298.             if ((oInsideRect.top < oRect.bottom && oInsideRect.bottom > oRect.top) && (oInsideRect.left < oRect.right && oInsideRect.right > oRect.left)) {
  1299.                 return oInsideRect;
  1300.             }
  1301.         }
  1302.     
  1303.     }
  1304.  
  1305.     return false;
  1306. }
  1307.  
  1308. function Clipmarks_ShowBorderDiv(oElement) {
  1309.     if (!oElement) {
  1310.         return;
  1311.     }
  1312.     if (Clipmarks_ActiveElement != null) {
  1313.         Clipmarks_HideBorderDiv(Clipmarks_ActiveElement);
  1314.         Clipmarks_ActiveElement = null;
  1315.     }
  1316.     
  1317.     var oDocument = oElement.ownerDocument;
  1318.  
  1319.     var oRect = Clipmarks_GetRect(oDocument, oElement);
  1320.     if (oElement.tagName != 'IMG') {
  1321.         if (((oRect.right - oRect.left) > 250 && (oRect.bottom - oRect.top) > 500) || ((oRect.right - oRect.left) > 500 && (oRect.bottom - oRect.top) > 250)) {
  1322.             return;
  1323.         }
  1324.     }
  1325.     Clipmarks_ActiveElement = oElement;
  1326.  
  1327.     var oInsideElement = null;
  1328.     var oInsideRect = null;
  1329.     
  1330.     var bIsSquare = false;
  1331.     var bBoxOnLeft = false;
  1332.  
  1333.     if (oElement.tagName == 'IMG') {
  1334.         bIsSquare = true;
  1335.     } else {
  1336.         oInsideElement = oElement.previousSibling;
  1337.         Clipmarks_SiblingsChecked = 0;
  1338.         oInsideRect = Clipmarks_CheckForOverlappingRect(oRect, oElement);
  1339.         if (!oInsideRect) {
  1340.             if (oDocument.location.href.indexOf('forbes.com') > 0 && oElement.parentNode && oElement.parentNode.previousSibling) {
  1341.                 oInsideRect = Clipmarks_CheckForOverlappingRect(oRect, oElement.parentNode.previousSibling);
  1342.             } else if (oElement.parentNode) {
  1343.                 oInsideRect = Clipmarks_CheckForOverlappingRect(oRect, oElement.parentNode);
  1344.                 if (!oInsideRect && oElement.parentNode.parentNode) {
  1345.                     oInsideRect = Clipmarks_CheckForOverlappingRect(oRect, oElement.parentNode.parentNode);
  1346.                 }
  1347.             }
  1348.         }
  1349.         
  1350.         if (!oInsideRect) {
  1351.             bIsSquare = true;
  1352.         } else {
  1353.             if (oInsideRect.left - 5 < oRect.left) {
  1354.                 bBoxOnLeft = true;
  1355.             }
  1356.             
  1357.             if (oInsideRect.bottom + 5 > oRect.bottom) {
  1358.                 bIsSquare = true;
  1359.             }
  1360.             
  1361.         }
  1362.     }
  1363.         
  1364.     if (oInsideRect && bIsSquare) {
  1365.         if (bBoxOnLeft) {
  1366.             oRect.left = oInsideRect.right;
  1367.         } else {
  1368.             oRect.right = oInsideRect.left;
  1369.         }
  1370.     }
  1371.         
  1372.     if (bIsSquare) {
  1373.         Clipmarks_MakeLine(oDocument, oRect.top - 4, oRect.left - 4, (oRect.right - oRect.left) + 8, false);
  1374.         Clipmarks_MakeLine(oDocument, oRect.top, oRect.left - 4, oRect.bottom - oRect.top, true);
  1375.         Clipmarks_MakeLine(oDocument, oRect.top, oRect.right, oRect.bottom - oRect.top, true);
  1376.         Clipmarks_MakeLine(oDocument, oRect.bottom, oRect.left - 4, (oRect.right - oRect.left) + 8, false);
  1377.     } else {
  1378.         if (bBoxOnLeft) {
  1379.             Clipmarks_MakeLine(oDocument, oRect.top - 4, oInsideRect.right - 4, (oRect.right - oInsideRect.right) + 8, false);
  1380.             Clipmarks_MakeLine(oDocument, oRect.top, oInsideRect.right - 4, oInsideRect.bottom - oRect.top, true);
  1381.             Clipmarks_MakeLine(oDocument, oInsideRect.bottom - 4, oRect.left - 4, (oInsideRect.right - oRect.left) + 4, false);
  1382.             Clipmarks_MakeLine(oDocument, oInsideRect.bottom, oRect.left - 4, oRect.bottom - oInsideRect.bottom, true);
  1383.             Clipmarks_MakeLine(oDocument, oRect.top, oRect.right, oRect.bottom - oRect.top, true);
  1384.             Clipmarks_MakeLine(oDocument, oRect.bottom, oRect.left - 4, (oRect.right - oRect.left) + 8, false);
  1385.         } else {
  1386.             Clipmarks_MakeLine(oDocument, oRect.top -4, oRect.left - 4, (oInsideRect.left - oRect.left) + 8, false);
  1387.             Clipmarks_MakeLine(oDocument, oRect.top, oRect.left - 4, oRect.bottom - oRect.top, true);
  1388.             Clipmarks_MakeLine(oDocument, oInsideRect.bottom - 4, oInsideRect.left, (oRect.right - oInsideRect.left) + 4, false);
  1389.             Clipmarks_MakeLine(oDocument, oInsideRect.bottom, oRect.right, oRect.bottom - oInsideRect.bottom, true);
  1390.             Clipmarks_MakeLine(oDocument, oRect.top, oInsideRect.left, oInsideRect.bottom - oRect.top, true);
  1391.             Clipmarks_MakeLine(oDocument, oRect.bottom, oRect.left - 4, (oRect.right - oRect.left) + 8, false);
  1392.         }
  1393.     
  1394.     }
  1395. }
  1396.  
  1397. function Clipmarks_GetRect(oDocument, oElement) {
  1398.     var coords = { left: 0, top: 0, right: 0, bottom: 0 };
  1399.     var oRect = null;
  1400.     if (oElement.getBoundingClientRect) {
  1401.         oRect = oElement.getBoundingClientRect();
  1402.         coords.left = Clipmarks_OffsetLeft(oElement);
  1403.         coords.right = (oRect.right - oRect.left) + coords.left;
  1404.         coords.top = Clipmarks_OffsetTop(oElement);
  1405.         coords.bottom = (oRect.bottom - oRect.top) + coords.top;
  1406.     } else if (oDocument.getBoxObjectFor) {
  1407.         oRect = oDocument.getBoxObjectFor(oElement);
  1408.         coords.left = oRect.x;
  1409.         coords.right = oRect.x + oRect.width;
  1410.         coords.top = oRect.y;
  1411.         coords.bottom = oRect.y + oRect.height;
  1412.     } else {
  1413.         coords.right = oElement.offsetWidth;
  1414.         coords.bottom = oElement.offsetHeight;
  1415.         coords.left = Clipmarks_OffsetLeft(oElement);
  1416.         coords.top = Clipmarks_OffsetTop(oElement);
  1417.         coords.right += coords.left;
  1418.         coords.bottom += coords.top;
  1419.     }
  1420.     return coords;
  1421. }
  1422.  
  1423. function Clipmarks_MakeLine(oDocument, lTop, lLeft, lLength, bVertical, sName) {
  1424.     var oLineDiv = null;
  1425.     if (!sName) {
  1426.         sName = 'Clipmarks_LineElement';
  1427.     }
  1428.     oLineDiv = oDocument.createElement('DIV');
  1429.     oLineDiv.setAttribute('name', sName);
  1430.     oLineDiv.style.position = 'absolute';
  1431.     oLineDiv.style.border = 'orange 2px solid';
  1432.     oLineDiv.align = 'left';
  1433.     if (bVertical) {
  1434.         oLineDiv.style.height = lLength + 'px';
  1435.         oLineDiv.style.width = '0px';
  1436.         oLineDiv.style.borderWidth = '0px 2px 0px 2px';
  1437.     } else {
  1438.         oLineDiv.style.height = '0px';
  1439.         oLineDiv.style.width = lLength + 'px';
  1440.         oLineDiv.style.borderWidth = '2px 0px 2px 0px';
  1441.     }
  1442.     oLineDiv.style.display = 'block';
  1443.     oLineDiv.style.zIndex = '99998';
  1444.     oLineDiv.style.padding = '0px';
  1445.     oLineDiv.style.margin = '0px';
  1446.     oLineDiv.style.left = (lLeft) + 'px';
  1447.     oLineDiv.style.top = (lTop) + 'px';
  1448.  
  1449.     oDocument.body.appendChild(oLineDiv);
  1450. }
  1451.  
  1452. function Clipmarks_HideBorderDiv(oElement) {
  1453.     var oDocument = oElement.ownerDocument;
  1454.     var oBorderDivs = oDocument.getElementsByName('Clipmarks_LineElement');
  1455.     
  1456.     for (i = oBorderDivs.length - 1; i >= 0; i--) {
  1457.         oDocument.body.removeChild(oBorderDivs[i]);
  1458.     }
  1459. }
  1460.  
  1461.  
  1462. function getAccessibleFor(domNode) {
  1463.   var accRetrieval = null;
  1464.   try {
  1465.     accRetrieval = Components.classes["@mozilla.org/accessibleRetrieval;1"].createInstance(Components.interfaces.nsIAccessibleRetrieval);
  1466.   }
  1467.   catch (ex) { dump ("\nError getting accessibility retrieval service\n" + ex);}
  1468.  
  1469.   if (!accRetrieval) {
  1470.     alert("No accessible retrieval");
  1471.     return null;
  1472.   }
  1473.    
  1474.   try {
  1475.     return accRetrieval.getAccessibleFor(domNode);
  1476.   } catch(ex) { }
  1477.   
  1478.   return null;
  1479. }   
  1480.  
  1481.  
  1482. function Clipmarks_ElementMouseOver(event) {
  1483.     if (Clipmarks_ClipMode == 0 || Clipmarks_ContextMenuVisible || !Clipmarks_UseBorders) {
  1484.         return true;
  1485.     }
  1486.  
  1487.     if (    event.target.tagName == 'BODY' || event.target.tagName == 'HTML' || 
  1488.             event.target.tagName == 'FRAME' || event.target.tagName == 'FRAMESET' || 
  1489.             event.target.tagName == 'IFRAME' || event.target.tagName == 'A' || 
  1490.             event.target.tagName == 'INPUT' || event.target.tagName == 'BUTTON' || event.target.tagName == 'EMBED' ||
  1491.             event.target.id == Clipmarks_BorderLeftId || event.target.id == Clipmarks_BorderRightId || 
  1492.             event.target.id == Clipmarks_BorderTopId || event.target.id == Clipmarks_BorderBottomId || event.target.id == 'Clipmarks_LineElement' ||
  1493.             event.target.id == 'Clipmarks_HighlightDiv' || event.target.id == 'Clipmarks_HighlightDivChild' ||
  1494.             event.target.id == 'Clipmarks_SelectionClipper' || Clipmarks_GetAttribute(event.target, 'name') == 'Clipmarks_SelectionBounds' ||
  1495.             event.target.id == 'Clipmarks_ClipModeShadow' || event.target.id == 'Clipmarks_ClipModeFrame' ||
  1496.             Clipmarks_GetAttribute(event.target, 'name') == 'Clipmarks_ObjectDiv' || Clipmarks_GetAttribute(event.target, 'name') == 'Clipmarks_ObjectDivHeader' ||
  1497.             (event.target.offsetHeight < 10 && event.target.offsetWidth < 10)) {
  1498.         return true;
  1499.     }
  1500.  
  1501.     var bIsAnchor = false;
  1502.     var oParent = null;
  1503.     var i = 0;
  1504.     
  1505.     if (event.target.tagName != 'IMG') {
  1506.         oParent = event.target;
  1507.  
  1508.         for (i = 0; i < 3; i++ ) {
  1509.             if (oParent.tagName == 'A' || oParent.tagName == 'BODY') {
  1510.                 break;
  1511.             }
  1512.             oParent = oParent.parentNode;
  1513.         }
  1514.  
  1515.         if (oParent.tagName == 'A') {
  1516.             bIsAnchor = true;
  1517.             return true;
  1518.         }
  1519.     }
  1520.  
  1521.     Clipmarks_ElementIsColumn = false;
  1522.     Clipmarks_ShowBorderDiv(event.target);
  1523.     event.target.addEventListener('click', Clipmarks_ElementClick, true);
  1524.     event.target.addEventListener('contextmenu', Clipmarks_ElementContextMenu, true);
  1525.     return true;
  1526. }
  1527.  
  1528. function Clipmarks_ElementMouseOut(event) {
  1529.     if (!Clipmarks_ActiveElement || Clipmarks_ContextMenuVisible) {
  1530.         return true;
  1531.     }
  1532.     event.target.removeEventListener('click', Clipmarks_ElementClick, true);
  1533.     event.target.removeEventListener('contextmenu', Clipmarks_ElementContextMenu, true);
  1534.     Clipmarks_HideBorderDiv(Clipmarks_ActiveElement);
  1535.     Clipmarks_ActiveElement = null;
  1536.     return true;
  1537. }
  1538.  
  1539. function Clipmarks_ElementContextMenu(event) {
  1540.     if (Clipmarks_ClipMode == 0) {
  1541.         return true;
  1542.     }
  1543.     event.cancelBubble = true;
  1544.     event.preventDefault();
  1545.     event.stopPropagation();
  1546.     return false;
  1547. }
  1548.  
  1549. function Clipmarks_ElementClick(event) {
  1550.     if (Clipmarks_ActiveElement.tagName == 'EMBED' || Clipmarks_CancelClick || (event && Clipmarks_GetAttribute(event.target, 'name') == 'Clipmarks_SelectionBounds')) {
  1551.         Clipmarks_CancelClick = false;
  1552.         
  1553.         if (event) {
  1554.             event.cancelBubble = true;
  1555.             event.preventDefault();
  1556.             event.stopPropagation();
  1557.         }
  1558.         
  1559.         return false;
  1560.         //return true;
  1561.     }
  1562.     
  1563.     var oDocument = Clipmarks_ActiveElement.ownerDocument;
  1564.     var oHighlightDiv;
  1565.     var oHighlightDivChild;
  1566.     
  1567.     var oElement = Clipmarks_ActiveElement;
  1568.     var oRect = Clipmarks_GetRect(oDocument, oElement);
  1569.     var oInsideElement = null;
  1570.     var oInsideRect = null;
  1571.     
  1572.     var bIsSquare = false;
  1573.     var bBoxOnLeft = false;
  1574.  
  1575.     var lLeft = 0;
  1576.     var lTop = 0;
  1577.     var lWidth = 0;
  1578.     var lHeight = 0;
  1579.     
  1580.     var lClipElementIndex = Clipmarks_ClipElementIndex;
  1581.     Clipmarks_ClipElementIndex++;
  1582.  
  1583.     for (var i = Clipmarks_ClipElements.length - 1; i >= 0; i--) {
  1584.         if (Clipmarks_ContainsElement(Clipmarks_ActiveElement, Clipmarks_ClipElements[i])) {
  1585.             Clipmarks_RemoveElement(Clipmarks_ClipOverlays[i]);
  1586.         }
  1587.     }
  1588.  
  1589.     Clipmarks_HideBorderDiv(Clipmarks_ActiveElement);
  1590.  
  1591.     if (Clipmarks_ActiveElement.tagName == 'IMG') {
  1592.         Clipmarks_ClipHTMLImg(Clipmarks_ActiveElement);
  1593.     } else if (Clipmarks_ActiveElement.tagName == 'EMBED') {
  1594.         Clipmarks_ClipHTMLEmbed(Clipmarks_ActiveElement);
  1595.     } else {
  1596.         Clipmarks_ClipHTMLElement(Clipmarks_ActiveElement, Clipmarks_ElementIsColumn);
  1597.     }
  1598.  
  1599.     Clipmarks_ClipXML.documentElement.lastChild.setAttribute('clip-index', lClipElementIndex);
  1600.     
  1601.     
  1602.     
  1603.     
  1604.     
  1605.     
  1606.     
  1607.     
  1608.     
  1609.     
  1610.     
  1611.     if (oElement.tagName == 'IMG') {
  1612.         bIsSquare = true;
  1613.     } else {
  1614.         oInsideElement = oElement.previousSibling;
  1615.         Clipmarks_SiblingsChecked = 0;
  1616.         oInsideRect = Clipmarks_CheckForOverlappingRect(oRect, oElement);
  1617.         if (!oInsideRect) {
  1618.             if (oDocument.location.href.indexOf('forbes.com') > 0 && oElement.parentNode && oElement.parentNode.previousSibling) {
  1619.                 oInsideRect = Clipmarks_CheckForOverlappingRect(oRect, oElement.parentNode.previousSibling);
  1620.             } else if (oElement.parentNode) {
  1621.                 oInsideRect = Clipmarks_CheckForOverlappingRect(oRect, oElement.parentNode);
  1622.                 if (!oInsideRect && oElement.parentNode.parentNode) {
  1623.                     oInsideRect = Clipmarks_CheckForOverlappingRect(oRect, oElement.parentNode.parentNode);
  1624.                 }
  1625.             }
  1626.         }
  1627.         
  1628.         if (!oInsideRect) {
  1629.             bIsSquare = true;
  1630.         } else {
  1631.             if (oInsideRect.left - 5 < oRect.left) {
  1632.                 bBoxOnLeft = true;
  1633.             }
  1634.             
  1635.             if (oInsideRect.bottom + 5 > oRect.bottom) {
  1636.                 bIsSquare = true;
  1637.             }
  1638.             
  1639.         }
  1640.     }
  1641.     
  1642.     if (oInsideRect && bIsSquare) {
  1643.         if (bBoxOnLeft) {
  1644.             oRect.left = oInsideRect.right;
  1645.         } else {
  1646.             oRect.right = oInsideRect.left;
  1647.         }
  1648.     }
  1649.         
  1650.     lTop = oRect.top;
  1651.     lHeight = (oRect.bottom - oRect.top) + 2;
  1652.     if (oRect.top != 0) {
  1653.         lTop += -2;
  1654.         lHeight += 2;
  1655.     }
  1656.     
  1657.     if (bIsSquare) {
  1658.         lLeft = oRect.left;
  1659.         lWidth = (oRect.right - oRect.left) + 2;
  1660.         if (oRect.left != 0) {
  1661.             lLeft += -2;
  1662.             lWidth += 2;
  1663.         }
  1664.     } else {
  1665.         if (bBoxOnLeft) {
  1666.  
  1667.             lLeft = oInsideRect.right - 2;
  1668.             lWidth = (oRect.right - oInsideRect.right) + 4;
  1669.         
  1670.             Clipmarks_MakeLine(oDocument, oRect.top - 4, oInsideRect.right - 4, (oRect.right - oInsideRect.right) + 8, false, 'Clipmarks_SupportNode' + lClipElementIndex);
  1671.             Clipmarks_MakeLine(oDocument, oRect.top, oInsideRect.right - 4, oInsideRect.bottom - oRect.top, true, 'Clipmarks_SupportNode' + lClipElementIndex);
  1672.             Clipmarks_MakeLine(oDocument, oInsideRect.bottom - 4, oRect.left - 4, (oInsideRect.right - oRect.left) + 4, false, 'Clipmarks_SupportNode' + lClipElementIndex);
  1673.             Clipmarks_MakeLine(oDocument, oInsideRect.bottom, oRect.left - 4, oRect.bottom - oInsideRect.bottom, true, 'Clipmarks_SupportNode' + lClipElementIndex);
  1674.             Clipmarks_MakeLine(oDocument, oRect.top, oRect.right, oRect.bottom - oRect.top, true, 'Clipmarks_SupportNode' + lClipElementIndex);
  1675.             Clipmarks_MakeLine(oDocument, oRect.bottom, oRect.left - 4, (oRect.right - oRect.left) + 8, false, 'Clipmarks_SupportNode' + lClipElementIndex);
  1676.         } else {
  1677.  
  1678.             lLeft = oRect.left;
  1679.             lWidth = (oInsideRect.left - oRect.left) + 2;
  1680.             if (oRect.left != 0) {
  1681.                 lLeft += -2;
  1682.                 lWidth += 2;
  1683.             }
  1684.         
  1685.             Clipmarks_MakeLine(oDocument, oRect.top -4, oRect.left - 4, (oInsideRect.left - oRect.left) + 8, false, 'Clipmarks_SupportNode' + lClipElementIndex);
  1686.             Clipmarks_MakeLine(oDocument, oRect.top, oRect.left - 4, oRect.bottom - oRect.top, true, 'Clipmarks_SupportNode' + lClipElementIndex);
  1687.             Clipmarks_MakeLine(oDocument, oInsideRect.bottom - 4, oInsideRect.left, (oRect.right - oInsideRect.left) + 4, false, 'Clipmarks_SupportNode' + lClipElementIndex);
  1688.             Clipmarks_MakeLine(oDocument, oInsideRect.bottom, oRect.right, oRect.bottom - oInsideRect.bottom, true, 'Clipmarks_SupportNode' + lClipElementIndex);
  1689.             Clipmarks_MakeLine(oDocument, oRect.top, oInsideRect.left, oInsideRect.bottom - oRect.top, true, 'Clipmarks_SupportNode' + lClipElementIndex);
  1690.             Clipmarks_MakeLine(oDocument, oRect.bottom, oRect.left - 4, (oRect.right - oRect.left) + 8, false, 'Clipmarks_SupportNode' + lClipElementIndex);
  1691.         }
  1692.     
  1693.     }
  1694.  
  1695.  
  1696.  
  1697.  
  1698.     oHighlightDiv = oDocument.createElement('DIV');
  1699.     oHighlightDiv.id = 'Clipmarks_HighlightDiv';
  1700.     oHighlightDiv.align = 'left';
  1701.     oHighlightDiv.style.position = 'absolute';
  1702.     if (bIsSquare) {
  1703.         oHighlightDiv.style.border = '#FF9900 2px solid';
  1704.     }
  1705.     oHighlightDiv.style.left = lLeft + 'px';
  1706.     oHighlightDiv.style.top = lTop + 'px';
  1707.     oHighlightDiv.style.width = lWidth + 'px';
  1708.     oHighlightDiv.style.height = lHeight + 'px';
  1709.     oHighlightDiv.style.zIndex = '99998';
  1710.     oHighlightDiv.style.padding = '0px';
  1711.     oHighlightDiv.style.margin = '0px';
  1712.     oHighlightDiv.style.textAlign = 'left';
  1713.  
  1714.     oHighlightDiv.addEventListener('click', Clipmarks_HighlightElementClick, true);
  1715.     oHighlightDiv.setAttribute('clip-index', lClipElementIndex);
  1716.     
  1717.     oDocument.body.appendChild(oHighlightDiv);
  1718.     
  1719.     oHighlightDivChild = oDocument.createElement('DIV');
  1720.     oHighlightDivChild.id = 'Clipmarks_HighlightDivChild';
  1721.     oHighlightDivChild.style.position = 'absolute';
  1722.     oHighlightDivChild.style.width = '100%';
  1723.     oHighlightDivChild.style.height = '100%';
  1724.     oHighlightDivChild.style.lineHeight = (lHeight - 4) + 'px';
  1725.     oHighlightDivChild.align = 'center';
  1726.     oHighlightDivChild.verticalAlign = 'middle';
  1727.     oHighlightDivChild.style.padding = '0px';
  1728.     oHighlightDivChild.style.margin = '0px';
  1729.     oHighlightDivChild.style.textAlign = 'center';
  1730.     if ((lHeight * 3.94) < lWidth) {
  1731.         if (lHeight >= 72) {
  1732.             oHighlightDivChild.innerHTML = ' <img style="vertical-align:middle;display:inline;" src="http://content0.clipmarks.com/images/clipped.png" width="272" height="69" id="Clipmarks_HighlightDivChild" />';
  1733.         } else {
  1734.             oHighlightDivChild.innerHTML = ' <img style="vertical-align:middle;display:inline;" src="http://content0.clipmarks.com/images/clipped.png" height="' + parseInt(lHeight * .9) + '" id="Clipmarks_HighlightDivChild" />';
  1735.         }
  1736.     } else {
  1737.         if (lWidth >= 278) {
  1738.             oHighlightDivChild.innerHTML = ' <img style="vertical-align:middle;display:inline;" src="http://content0.clipmarks.com/images/clipped.png" width="272" height="69" id="Clipmarks_HighlightDivChild" />';
  1739.         } else {
  1740.             oHighlightDivChild.innerHTML = ' <img style="vertical-align:middle;display:inline;" src="http://content0.clipmarks.com/images/clipped.png" width="' + parseInt(lWidth * .9) + '" id="Clipmarks_HighlightDivChild" />';
  1741.         }
  1742.     }
  1743.     oHighlightDivChild.style.backgroundColor = '#4DC136';
  1744.     oHighlightDivChild.style.opacity = '0.85';
  1745.     oHighlightDivChild.style.Mozopacity = '0.85';
  1746.     oHighlightDiv.appendChild(oHighlightDivChild);
  1747.  
  1748.  
  1749.     Clipmarks_ClipElements[Clipmarks_ClipElements.length] = Clipmarks_ActiveElement;
  1750.     Clipmarks_ClipOverlays[Clipmarks_ClipOverlays.length] = oHighlightDiv;
  1751.  
  1752.  
  1753.  
  1754.     if (!bIsSquare) {
  1755.         lTop = oInsideRect.bottom - 2;
  1756.         lHeight = (oRect.bottom - oInsideRect.bottom) + 4;
  1757.         if (bBoxOnLeft) {
  1758.             lLeft = oRect.left - 2;
  1759.             lWidth = (oInsideRect.right - oRect.left);
  1760.         } else {
  1761.             lLeft = oInsideRect.left + 2;
  1762.             lWidth = oRect.right - oInsideRect.left;
  1763.         }
  1764.           oHighlightDiv = oDocument.createElement('DIV');
  1765.         oHighlightDiv.setAttribute('name', 'Clipmarks_SupportNode' + lClipElementIndex);
  1766.         oHighlightDiv.align = 'left';
  1767.         oHighlightDiv.style.position = 'absolute';
  1768.         oHighlightDiv.style.left = lLeft + 'px';
  1769.         oHighlightDiv.style.top = lTop + 'px';
  1770.         oHighlightDiv.style.width = lWidth + 'px';
  1771.         oHighlightDiv.style.height = lHeight + 'px';
  1772.         oHighlightDiv.style.zIndex = '99998';
  1773.         oHighlightDiv.style.padding = '0px';
  1774.         oHighlightDiv.style.margin = '0px';
  1775.         oHighlightDiv.style.textAlign = 'left';
  1776.  
  1777.         oHighlightDiv.addEventListener('click', Clipmarks_HighlightElementClick, true);
  1778.         oHighlightDiv.setAttribute('clip-index', lClipElementIndex);
  1779.         
  1780.         oDocument.body.appendChild(oHighlightDiv);
  1781.         
  1782.         oHighlightDivChild = oDocument.createElement('DIV');
  1783.         oHighlightDivChild.id = 'Clipmarks_HighlightDivChild';
  1784.         oHighlightDivChild.style.position = 'absolute';
  1785.         oHighlightDivChild.style.width = '100%';
  1786.         oHighlightDivChild.style.height = '100%';
  1787.         oHighlightDivChild.style.padding = '0px';
  1788.         oHighlightDivChild.style.margin = '0px';
  1789.         oHighlightDivChild.style.backgroundColor = '#4DC136';
  1790.         oHighlightDivChild.style.opacity = '0.85';
  1791.         oHighlightDivChild.style.Mozopacity = '0.85';
  1792.         oHighlightDiv.appendChild(oHighlightDivChild);
  1793.  
  1794.     
  1795.     }
  1796.     
  1797.     
  1798.     
  1799.     
  1800.  
  1801.     
  1802.     oHighlightDivChild = null;
  1803.     oHighlightDiv = null;
  1804.     
  1805.     Clipmarks_ActiveElement = null;
  1806.  
  1807.     if (event) {
  1808.         event.cancelBubble = true;
  1809.         event.preventDefault();
  1810.         event.stopPropagation();
  1811.     }
  1812.     
  1813.     Clipmarks_CalcPopLimit();
  1814.     
  1815.     return false;
  1816. }
  1817.  
  1818. function Clipmarks_CalcPopLimit() {
  1819.     var i = 0;
  1820.     var sHTML = new String();
  1821.     var lTotalChars = 0;
  1822.     var lChars = 0;
  1823.     var j = 0;
  1824.     var oFrameXML = null;
  1825.     
  1826.     if (!!Clipmarks_ClipXML) {
  1827.         for (i = 0; i < Clipmarks_ClipXML.documentElement.childNodes.length; i++) {
  1828.             oFrameXML = Clipmarks_ClipXML.documentElement.childNodes[i];
  1829.             if (oFrameXML.getAttribute('type') == 'IHTMLTxtRange') {
  1830.  
  1831.                 if (oFrameXML.childNodes[0].nodeName == 'permalink') {
  1832.                     sHTML = oFrameXML.childNodes[2].childNodes[0].nodeValue;
  1833.                 } else {
  1834.                     sHTML = oFrameXML.childNodes[1].childNodes[0].nodeValue;
  1835.                 }
  1836.                 sHTML = sHTML.replace(/<style.*?>.*?<\/style>/g, ' ');
  1837.                 sHTML = sHTML.replace(/<[^>]+>/g, ' ');
  1838.                 sHTML = sHTML.replace(/\s+/g, ' ');
  1839.  
  1840.                 sHTML = Clipmarks_Trim(sHTML);
  1841.  
  1842.                 lChars = sHTML.length;
  1843.                 lTotalChars += lChars;
  1844.                 window.document.getElementById('Clipmarks_CharacterCount').value = lTotalChars;
  1845.                 if ((1000 - lTotalChars) < 0) {
  1846.                     window.document.getElementById('Clipmarks_CharactersRemaining').value = (lTotalChars - 1000);
  1847.                     window.document.getElementById('Clipmarks_CharactersRemainingText').value = ' OVER ';
  1848.                     
  1849.                     window.content.status = lTotalChars + ' characters clipped, ' + (lTotalChars - 1000) + ' OVER publishing limit.';
  1850.                 } else {
  1851.                     window.document.getElementById('Clipmarks_CharactersRemaining').value = (1000 - lTotalChars);
  1852.                     window.document.getElementById('Clipmarks_CharactersRemainingText').value = ' to ';
  1853.  
  1854.                     window.content.status = lTotalChars + ' characters clipped, ' + (1000 - lTotalChars) + ' to publishing limit.';
  1855.                 }
  1856.             }
  1857.         }
  1858.  
  1859.     }
  1860.  
  1861.     if (lTotalChars == 0) {
  1862.         window.document.getElementById('Clipmarks_CharacterCount').value = 0;
  1863.         window.document.getElementById('Clipmarks_CharactersRemaining').value = 1000;
  1864.         window.document.getElementById('Clipmarks_CharactersRemainingText').value = ' to ';
  1865.         window.content.status = '0 characters clipped, 1000 remaining.';
  1866.     }
  1867.     
  1868. /*    if (lTotalChars > 1000) {
  1869.         window.document.getElementById('Clipmarks_BlogClip').disabled = true;
  1870.         window.document.getElementById('Clipmarks_BlogClip').src = 'chrome://clipmarks/skin/save-bar-blog-inactive.png';
  1871.         window.document.getElementById('Clipmarks_BlogClip').tooltipText = 'you have exceeded the Clip-to-Blog limit of 1,000 characters';
  1872.     } else {
  1873.         window.document.getElementById('Clipmarks_BlogClip').disabled = false;
  1874.         window.document.getElementById('Clipmarks_BlogClip').src = 'chrome://clipmarks/skin/save-bar-blog-active.png';
  1875.         window.document.getElementById('Clipmarks_BlogClip').tooltipText = 'post to your blog';
  1876.     }
  1877. */    
  1878.     Clipmarks_CharCount = lTotalChars;
  1879. }
  1880.  
  1881. function Clipmarks_ClipHTMLImg(oImage) {
  1882.     var oSourceDocument = oImage.ownerDocument;
  1883.     var oFrameElement = Clipmarks_ClipXML.createElement('frame');
  1884.     var oImageElement = Clipmarks_ClipXML.createElement('image');
  1885.     var oAttribute;
  1886.     
  1887.     oFrameElement.setAttribute('type', 'HTMLImg');
  1888.     oFrameElement.setAttribute('background-color', oSourceDocument.bgColor);
  1889.     
  1890.     Clipmarks_DetectPermalink(oFrameElement, oImage);
  1891.     Clipmarks_BuildSourceNode(oFrameElement, oSourceDocument);
  1892.     
  1893.     oImageElement.appendChild(Clipmarks_ClipXML.createElement('src')).textContent = oImage.src;
  1894.     oImageElement.appendChild(Clipmarks_ClipXML.createElement('alt')).textContent = oImage.alt;
  1895.     oImageElement.appendChild(Clipmarks_ClipXML.createElement('height')).textContent = oImage.height;
  1896.     oImageElement.appendChild(Clipmarks_ClipXML.createElement('width')).textContent = oImage.width;
  1897.  
  1898.     oFrameElement.appendChild(oImageElement);
  1899.     oImageElement = null;
  1900.     
  1901.     Clipmarks_ClipXML.documentElement.appendChild(oFrameElement);
  1902.     oFrameElement = null;
  1903. }
  1904.  
  1905. function Clipmarks_ClipHTMLEmbed(oEmbed, lIndex) {
  1906.     var sSrc = '';
  1907.     var sType = '';
  1908.     var sFlashVars = '';
  1909.     var oSourceDocument = oEmbed.ownerDocument;
  1910.     var oInputs = oSourceDocument.getElementsByTagName('INPUT');
  1911.     var oFrameElement = Clipmarks_ClipXML.createElement('frame');
  1912.     var oImageElement = Clipmarks_ClipXML.createElement('embed');
  1913.     var oAttribute;
  1914.     var sAlert = '';
  1915.     var bEmbedFound = false;
  1916.     
  1917.     oFrameElement.setAttribute('type', 'HTMLEmbed');
  1918.     oFrameElement.setAttribute('background-color', oSourceDocument.bgColor);
  1919.     oFrameElement.setAttribute('embed-index', lIndex);
  1920.     
  1921.     Clipmarks_DetectPermalink(oFrameElement, oEmbed);
  1922.     Clipmarks_BuildSourceNode(oFrameElement, oSourceDocument);
  1923.     
  1924.     for (i = 0; i < oInputs.length; i++) {
  1925.         if (oInputs[i].type == 'text') {
  1926.             sSrc = oInputs[i].value.replace(/.*\<embed[^\<]+src\=([\"\'])([^\"\']*)\1.*/mig, '$2');
  1927.             sAlert += i + ' - ' + sSrc + '\n' + oInputs[i].value + '\n\n';
  1928.             if (sSrc != '' && sSrc != oInputs[i].value) {
  1929.                 sType = oInputs[i].value.replace(/.*\<embed[^\<]+type\=([\"\'])([^\"\']*)\1.*/mig, '$2');
  1930.                 if (sType == oInputs[i].value) {
  1931.                     sType = '';
  1932.                 }
  1933.                 sFlashVars = oInputs[i].value.replace(/.*\<embed[^\<]+flashvars\=([\"\'])([^\"\']*)\1.*/mig, '$2');
  1934.                 if (sFlashVars == oInputs[i].value) {
  1935.                     sFlashVars = '';
  1936.                 }
  1937.                 bEmbedFound = true;
  1938.                 break;
  1939.             }
  1940.         }
  1941.     }
  1942.  
  1943.     if (!bEmbedFound) {
  1944.         sSrc = oEmbed.src;
  1945.     }
  1946.  
  1947.     oImageElement.setAttribute('src', sSrc);
  1948.     oImageElement.setAttribute('pluginspage', Clipmarks_GetAttribute(oEmbed, 'pluginspage', ''));
  1949.     oImageElement.setAttribute('width', Clipmarks_GetAttribute(oEmbed, 'width', 0));
  1950.     oImageElement.setAttribute('height', Clipmarks_GetAttribute(oEmbed, 'height', 0));
  1951.     if (sType != '') {
  1952.         oImageElement.appendChild(Clipmarks_ClipXML.createElement('type')).textContent = sType;
  1953.     }
  1954.     if (sFlashVars != '') {
  1955.         oImageElement.appendChild(Clipmarks_ClipXML.createElement('flashvars')).textContent = sFlashVars;
  1956.     }
  1957.  
  1958.     if (!bEmbedFound) {
  1959.         for (var i = 0; i < oEmbed.attributes.length; i++) {
  1960.             oAttribute = oEmbed.attributes[i];
  1961.             if (oAttribute.name != 'style' && oAttribute.name != 'src' && oAttribute.name != 'pluginspage' && oAttribute.name != 'height' && oAttribute.name != 'width') {
  1962.                 oImageElement.appendChild(Clipmarks_ClipXML.createElement(oAttribute.name)).textContent = oAttribute.value;
  1963.             }
  1964.         }
  1965.     }
  1966.  
  1967.     oFrameElement.appendChild(oImageElement);
  1968.     oImageElement = null;
  1969.     
  1970.     Clipmarks_ClipXML.documentElement.appendChild(oFrameElement);
  1971.     oFrameElement = null;
  1972. }
  1973.  
  1974. function Clipmarks_ClipHTMLElement(oTxtRange, bColumn) {
  1975.     var oSourceDocument = oTxtRange.ownerDocument;
  1976.     var oFrameElement = Clipmarks_ClipXML.createElement('frame');
  1977.     var oElementXML = Clipmarks_ClipXML.createElement('content');
  1978.     var oAttribute;
  1979.  
  1980.     var oParentElement;
  1981.     var i;
  1982.     var j;
  1983.     var k;
  1984.     var sContent = '';
  1985.     
  1986.     oFrameElement.setAttribute('type', 'IHTMLTxtRange');
  1987.     oFrameElement.setAttribute('background-color', oSourceDocument.bgColor);
  1988.  
  1989.     Clipmarks_DetectPermalink(oFrameElement, oTxtRange);
  1990.  
  1991.     Clipmarks_BuildSourceNode(oFrameElement, oSourceDocument);
  1992.     
  1993.     oElementXML.setAttribute('height', oTxtRange.clientHeight);
  1994.     oElementXML.setAttribute('width', oTxtRange.clientWidth);
  1995.     oElementXML.setAttribute('text-color', oSourceDocument.fgColor);
  1996.     oElementXML.setAttribute('link-color', oSourceDocument.linkColor);
  1997.     oElementXML.setAttribute('vlink-color', oSourceDocument.vlinkColor);
  1998.         
  1999.     if (oTxtRange.tagName == 'TR') {
  2000.         sContent = Clipmarks_GetOuterHTML(oTxtRange, true);
  2001.         oParentElement = oTxtRange.parentNode;
  2002.         while (oParentElement.tagName != 'TABLE') {
  2003.             oParentElement = oParentElement.parentNode;
  2004.         }
  2005.         oElementXML.appendChild(Clipmarks_ClipXML.createCDATASection(''));
  2006.         oElementXML.childNodes[0].textContent = '<table background="' + oParentElement.background + '" bgcolor="' + oParentElement.bgColor + '">' + sContent + '</table>';
  2007.  
  2008.     } else if (oTxtRange.tagName == 'TD') {
  2009.         if (!bColumn) {
  2010.             sContent = Clipmarks_GetOuterHTML(oTxtRange, true);
  2011.             oParentElement = oTxtRange.parentNode;
  2012.             while (oParentElement.tagName != 'TABLE') {
  2013.                 oParentElement = oParentElement.parentNode;
  2014.             }
  2015.             oElementXML.appendChild(Clipmarks_ClipXML.createCDATASection(''));
  2016.             oElementXML.childNodes[0].textContent = '<table background="' + oParentElement.background + '" bgcolor="' + oParentElement.bgColor + '"><tr>' + sContent + '</tr></table>';
  2017.         } else {
  2018.             oParentElement = oTxtRange.parentNode;
  2019.             i = 0;
  2020.             while (i < oParentElement.childNodes.length) {
  2021.                 if (oParentElement.childNodes[i] == oTxtRange) {
  2022.                     break;
  2023.                 }
  2024.                 i++;
  2025.             }
  2026.             
  2027.             while (oParentElement.tagName != 'TABLE') {
  2028.                 oParentElement = oParentElement.parentNode;
  2029.             }
  2030.  
  2031.             for (j = 0; j < oParentElement.childNodes.length; j++) {
  2032.                 for (k = 0; k < oParentElement.childNodes[j].childNodes.length; k++) {
  2033.                     if (oParentElement.childNodes[j].childNodes[k].childNodes[i]) {
  2034.                         sContent += '<tr>' + Clipmarks_GetOuterHTML(oParentElement.childNodes[j].childNodes[k].childNodes[i], true) + '</tr>';
  2035.                     }
  2036.                 }
  2037.             }
  2038.  
  2039.             oElementXML.appendChild(Clipmarks_ClipXML.createCDATASection(''));
  2040.             oElementXML.childNodes[0].textContent = '<table background="' + oParentElement.background + '" bgcolor="' + oParentElement.bgColor + '">' + sContent + '</table>';
  2041.         }
  2042.     } else {
  2043.         oElementXML.appendChild(Clipmarks_ClipXML.createCDATASection(''));
  2044.         oElementXML.childNodes[0].textContent = Clipmarks_GetOuterHTML(oTxtRange, true);
  2045.     }
  2046.     
  2047.  
  2048.     oFrameElement.appendChild(oElementXML);
  2049.     oElementXML = null;
  2050.     
  2051.     Clipmarks_ClipXML.documentElement.appendChild(oFrameElement);
  2052.     oFrameElement = null;
  2053. }
  2054.  
  2055. function Clipmarks_ClipSelection(e) {
  2056.     if (!Clipmarks_IsContentSelected) {
  2057.         return;
  2058.     }
  2059.     
  2060.     var oSourceDocument = e.target.ownerDocument;
  2061.     var oWindow = oSourceDocument.defaultView;
  2062.     
  2063.  
  2064.     var oSelection = oWindow.getSelection();
  2065.     var oRange = oSelection.getRangeAt(0);
  2066.     var oRange2 = oRange.cloneRange();
  2067.     var oDiv = oSourceDocument.createElement("DIV"); 
  2068.     oDiv.appendChild(oRange.cloneContents()); 
  2069.     
  2070.     if (oDiv.innerHTML.length <= 0) {
  2071.         return;
  2072.     }
  2073.  
  2074.     var oFrameElement = Clipmarks_ClipXML.createElement('frame');
  2075.     var oElementXML = Clipmarks_ClipXML.createElement('content');
  2076.     var oAttribute;
  2077.     var oImage = null;
  2078.  
  2079.     oFrameElement.setAttribute('type', 'IHTMLTxtRange');
  2080.     oFrameElement.setAttribute('selection', 'true');
  2081.     oFrameElement.setAttribute('background-color', oSourceDocument.bgColor);
  2082.     oFrameElement.setAttribute('clip-index', Clipmarks_ClipElementIndex);
  2083.  
  2084.     Clipmarks_DetectPermalink(oFrameElement, oRange.commonAncestorContainer);
  2085.  
  2086.     Clipmarks_BuildSourceNode(oFrameElement, oSourceDocument);
  2087.     
  2088.     oElementXML.setAttribute('height', oRange.commonAncestorContainer.clientHeight);
  2089.     oElementXML.setAttribute('width', oRange.commonAncestorContainer.clientWidth);
  2090.     oElementXML.setAttribute('text-color', oSourceDocument.fgColor);
  2091.     oElementXML.setAttribute('link-color', oSourceDocument.linkColor);
  2092.     oElementXML.setAttribute('vlink-color', oSourceDocument.vlinkColor);
  2093.         
  2094.     oElementXML.appendChild(Clipmarks_ClipXML.createCDATASection(Clipmarks_GetInnerHTML(oDiv)));
  2095.  
  2096.     oFrameElement.appendChild(oElementXML);
  2097.     oElementXML = null;
  2098.     
  2099.     Clipmarks_ClipXML.documentElement.appendChild(oFrameElement);
  2100.     oFrameElement = null;
  2101.     
  2102.     oSelection.collapse(oSourceDocument.body, 0);
  2103.     if (oRange.endContainer == oRange.startContainer) {
  2104.         var oWrapper = oSourceDocument.createElement('SPAN');
  2105.         oWrapper.setAttribute('clip-index', Clipmarks_ClipElementIndex);
  2106.         oWrapper.setAttribute('name', 'Clipmarks_SelectionBounds');
  2107.         oWrapper.style.backgroundColor = '#4DC136';
  2108.         oWrapper.style.display = 'inline';
  2109.         oWrapper.style.position = 'relative';
  2110.         oWrapper.style.fontSize = 'inherit !important';
  2111.         oWrapper.style.fontWeight = 'inherit !important';
  2112.         oWrapper.style.textDecoration = 'inherit !important';
  2113.         oWrapper.style.color = 'inherit !important';
  2114.         oWrapper.style.lineHeight = 'inherit !important';
  2115.         oWrapper.style.overflow = 'visible';
  2116.         oWrapper.style.left = '0px';
  2117.         oWrapper.style.top = '0px';
  2118.         oWrapper.style.padding = '0px';
  2119.         oWrapper.style.margin = '0px';
  2120.  
  2121.         oRange.surroundContents(oWrapper);
  2122.  
  2123.         oWrapper.addEventListener('click', Clipmarks_RemoveSelection, true);
  2124.  
  2125.     } else {
  2126.         oRange.collapse(true);
  2127.         oImage = oSourceDocument.createElement('IMG');
  2128.         oImage.setAttribute('name', 'Clipmarks_SelectionBounds');
  2129.         oImage.setAttribute('clip-index', Clipmarks_ClipElementIndex);
  2130.         oImage.setAttribute('style', 'display: inline !important;float:none;');
  2131.         oImage.src = 'http://content0.clipmarks.com/images/selection-left.png';
  2132.         oImage.style.position = 'relative';
  2133.         oImage.style.margin = '0px';
  2134.         oImage.style.marginBottom = '-3px';
  2135.         oImage.style.border = '0';
  2136.         oImage.style.cssFloat = 'none';
  2137.         oImage.style.display = 'inline';
  2138.         oRange.insertNode(oImage);
  2139.         oImage.addEventListener('click', Clipmarks_RemoveSelection, true);
  2140.  
  2141.         oRange2.collapse(false);
  2142.         
  2143.         oImage = oSourceDocument.createElement('IMG');
  2144.         oImage.setAttribute('name', 'Clipmarks_SelectionBounds');
  2145.         oImage.setAttribute('clip-index', Clipmarks_ClipElementIndex);
  2146.         oImage.setAttribute('style', 'display: inline !important;float:none;');
  2147.         oImage.src = 'http://content0.clipmarks.com/images/selection-right.png';
  2148.         oImage.style.position = 'relative';
  2149.         oImage.style.marginBottom = '-3px';
  2150.         oImage.style.border = '0';
  2151.         oImage.style.cssFloat = 'none';
  2152.         oImage.style.display = 'inline';
  2153.         oRange2.insertNode(oImage);
  2154.         oImage.addEventListener('click', Clipmarks_RemoveSelection, true);
  2155.     }
  2156.     Clipmarks_ClipElementIndex++;
  2157.  
  2158.     Clipmarks_RemoveSelectionClipper(oSourceDocument);
  2159.     Clipmarks_CalcPopLimit();
  2160. }
  2161.  
  2162. function Clipmarks_RemoveSelection(event) {
  2163.     var oElement = event.target;
  2164.     var oDocument = oElement.ownerDocument;
  2165.     
  2166.     while (Clipmarks_GetAttribute(oElement, 'name') != 'Clipmarks_SelectionBounds') {
  2167.         oElement = oElement.parentNode;
  2168.     }
  2169.  
  2170.     var lClipElementIndex = oElement.getAttribute('clip-index');
  2171.  
  2172.     for (i = 1; i < Clipmarks_ClipXML.documentElement.childNodes.length; i++) {
  2173.         if (Clipmarks_ClipXML.documentElement.childNodes[i].getAttribute('clip-index') == lClipElementIndex) {
  2174.             Clipmarks_ClipXML.documentElement.removeChild(Clipmarks_ClipXML.documentElement.childNodes[i]);
  2175.             break;
  2176.         }
  2177.     }
  2178.     
  2179.     Clipmarks_RemoveSelectionBounds(oDocument, lClipElementIndex);
  2180.  
  2181.     Clipmarks_CalcPopLimit();
  2182. }
  2183.  
  2184. function Clipmarks_RemoveSelectionClipper(oDocument) {
  2185.     if (oDocument.getElementById('Clipmarks_SelectionClipper')) {
  2186.         oDocument.body.removeChild(oDocument.getElementById('Clipmarks_SelectionClipper'));
  2187.     }
  2188. }
  2189.  
  2190. function Clipmarks_DetectPermalink(oFrameElement, oElement) {
  2191.     var oDoc = oElement.ownerDocument;
  2192.     var oLinks;
  2193.     var oLink;
  2194.     var i = 0;
  2195.     var oPermaLink = null;
  2196.     var bSkip = false;
  2197.     var oContainer = oElement;
  2198.     
  2199.     while (true) {
  2200.         i = 0;
  2201.         if (oContainer.tagName != null) {
  2202.             oLinks = oContainer.getElementsByTagName('A');
  2203.             while (i < oLinks.length) {
  2204.                 oLink = oLinks[i];
  2205.                 if (oLink.textContent.toLowerCase().indexOf('permanent link') != -1 || oLink.textContent.toLowerCase().indexOf('permalink') != -1) {
  2206.                     if (oPermaLink != null) {
  2207.                         if (oLink.href != oPermaLink.href) {
  2208.                             bSkip = true;
  2209.                             break;
  2210.                         }
  2211.                     }
  2212.                     oPermaLink = oLink;
  2213.                 } else if (oLink.hasAttribute('title')) {
  2214.                     if (oLink.getAttribute('title').toLowerCase().indexOf('permanent link') != -1 || oLink.getAttribute('title').toLowerCase().indexOf('permalink') != -1) {
  2215.                         if (oPermaLink != null) {
  2216.                             if (oLink.href != oPermaLink.href) {
  2217.                                 bSkip = true;
  2218.                                 break;
  2219.                             }
  2220.                         }
  2221.                         oPermaLink = oLink;
  2222.                     }
  2223.                 }
  2224.                 oLink = null;
  2225.                 i++;
  2226.             }
  2227.         }
  2228.         
  2229.         if (oPermaLink == null) {
  2230.             if (oContainer.nextSibling != null) {
  2231.                 oContainer = oContainer.nextSibling;
  2232.             } else if (oContainer.tagName != 'BODY' && oContainer.parentNode != null) {
  2233.                 oContainer = oContainer.parentNode;
  2234.             } else {
  2235.                 break;
  2236.             }
  2237.         } else {
  2238.             break;
  2239.         }
  2240.     }
  2241.     
  2242.     if (oPermaLink != null && !bSkip) {
  2243.         oFrameElement.appendChild(Clipmarks_ClipXML.createElement('permalink')).textContent = oPermaLink.href;
  2244.     }
  2245. }
  2246.  
  2247. function Clipmarks_BuildSourceNode(oFrameElement, oSourceDocument) {
  2248.     var sSourcePath;
  2249.     var sSourcePage;
  2250.     var oSourceElement;
  2251.     var oElement;
  2252.     
  2253.     sSourcePath = oSourceDocument.location.pathname;
  2254.     sSourcePage = sSourcePath.substr(sSourcePath.lastIndexOf('/') + 1);
  2255.     sSourcePath = sSourcePath.substr(0, sSourcePath.lastIndexOf('/') + 1);
  2256.     
  2257.     oSourceElement = Clipmarks_ClipXML.createElement('source');
  2258.     
  2259.     oElement = Clipmarks_ClipXML.createElement('base-href');
  2260.     if (oSourceDocument.getElementsByTagName('BASE').length > 0) {
  2261.         oElement.textContent = oSourceDocument.getElementsByTagName('BASE')[oSourceDocument.getElementsByTagName('BASE').length - 1].href;
  2262.     }
  2263.     oSourceElement.appendChild(oElement);
  2264.     
  2265.     oElement = Clipmarks_ClipXML.createElement('protocol');
  2266.     oElement.textContent = oSourceDocument.location.protocol;
  2267.     oSourceElement.appendChild(oElement);
  2268.     
  2269.     oElement = Clipmarks_ClipXML.createElement('host');
  2270.     oElement.textContent = oSourceDocument.location.host;
  2271.     oSourceElement.appendChild(oElement);
  2272.     
  2273.     oElement = Clipmarks_ClipXML.createElement('path');
  2274.     oElement.textContent = sSourcePath;
  2275.     oSourceElement.appendChild(oElement);
  2276.     
  2277.     oElement = Clipmarks_ClipXML.createElement('page');
  2278.     oElement.textContent = sSourcePage;
  2279.     oSourceElement.appendChild(oElement);
  2280.     
  2281.     oElement = Clipmarks_ClipXML.createElement('query');
  2282.     oElement.textContent = oSourceDocument.location.search;
  2283.     oSourceElement.appendChild(oElement);
  2284.  
  2285.     oFrameElement.appendChild(oSourceElement);
  2286. }
  2287.  
  2288. function Clipmarks_HighlightElementClick(event) {
  2289.     Clipmarks_RemoveElement(event.target);
  2290. }
  2291.  
  2292. function Clipmarks_RemoveElement(oOverlay) {
  2293.     var oDocument = oOverlay.ownerDocument;
  2294.     
  2295.     while (oOverlay.id == 'Clipmarks_HighlightDivChild') {
  2296.         oOverlay = oOverlay.parentNode;
  2297.     }
  2298.  
  2299.     var j = 0;
  2300.     var i = 0;
  2301.     var oOverlays = new Array();
  2302.     var oElements = new Array();
  2303.     var lClipElementIndex = oOverlay.getAttribute('clip-index');
  2304.     var oSupportingNodes = oDocument.getElementsByName('Clipmarks_SupportNode' + lClipElementIndex);
  2305.     
  2306.     for (i = oSupportingNodes.length - 1; i >= 0; i--) {
  2307.         oDocument.body.removeChild(oSupportingNodes[i]);
  2308.     }
  2309.     
  2310.     for (i = 0; i < Clipmarks_ClipOverlays.length; i++) {
  2311.         if (lClipElementIndex == Clipmarks_ClipOverlays[i].getAttribute('clip-index')) {
  2312.             oDocument.body.removeChild(Clipmarks_ClipOverlays[i]);
  2313.             
  2314.             for (j = 1; j < Clipmarks_ClipXML.documentElement.childNodes.length; j++) {
  2315.                 if (Clipmarks_ClipXML.documentElement.childNodes[j].getAttribute('clip-index') == lClipElementIndex) {
  2316.                     Clipmarks_ClipXML.documentElement.removeChild(Clipmarks_ClipXML.documentElement.childNodes[j]);
  2317.                     
  2318.                     break;
  2319.                 }
  2320.             }    
  2321.             
  2322.         } else {
  2323.             oOverlays[oOverlays.length] = Clipmarks_ClipOverlays[i];
  2324.             oElements[oElements.length] = Clipmarks_ClipElements[i];
  2325.         }
  2326.     }
  2327.     
  2328.     Clipmarks_ClipOverlays = oOverlays;
  2329.     Clipmarks_ClipElements = oElements;
  2330.     
  2331.     Clipmarks_CalcPopLimit();
  2332. }
  2333.  
  2334. function Clipmarks_ClearOverlays() {
  2335.     var oDocument;
  2336.     var i = 0;
  2337.     var j = 0;
  2338.     var oSupportingNodes = null;
  2339.     
  2340.     for (i = (Clipmarks_ClipOverlays.length - 1); i >= 0 ; i--) {
  2341.         oDocument = Clipmarks_ClipOverlays[i].ownerDocument;
  2342.  
  2343.         oSupportingNodes = oDocument.getElementsByName('Clipmarks_SupportNode' + Clipmarks_ClipOverlays[i].getAttribute('clip-index'));
  2344.         
  2345.         for (j = oSupportingNodes.length - 1; j >= 0; j--) {
  2346.             oDocument.body.removeChild(oSupportingNodes[j]);
  2347.         }
  2348.         
  2349.         oDocument.body.removeChild(Clipmarks_ClipOverlays[i]);
  2350.     }
  2351.  
  2352.     Clipmarks_InitXML();
  2353.     Clipmarks_ClipOverlays = new Array();
  2354.     Clipmarks_ClipElements = new Array();
  2355. }
  2356.  
  2357. function Clipmarks_Navigate(event, type) {
  2358.     var win = window._content.document;
  2359.     var URL;
  2360.     
  2361.     switch(type) {
  2362.         case 'home':
  2363.             URL = CLIPMARKS_URL_HOME;
  2364.             break;
  2365.         case 'public_library':
  2366.             URL = CLIPMARKS_URL_PUBLIC_LIBRARY;
  2367.             break;
  2368.         case 'my_library':
  2369.             URL = CLIPMARKS_URL_MY_LIBRARY;
  2370.             break;
  2371.         case 'my_widget':
  2372.             URL = CLIPMARKS_URL_MY_WIDGET;
  2373.             break;
  2374.         case 'settings':
  2375.             URL = CLIPMARKS_URL_MY_PROFILE;
  2376.             break;
  2377.         case 'help':
  2378.             URL = CLIPMARKS_URL_HELP;
  2379.             break;
  2380.     }
  2381.  
  2382.     Clipmarks_LoadURL(URL);
  2383. }
  2384.  
  2385. function Clipmarks_LoadURL(URL) {
  2386.     window._content.document.location = URL;
  2387.     window.content.focus();
  2388. }
  2389.